转载请注明出处:http://blog.csdn.net/vmurder/article/details/42671865
其实我就是觉得原创的访问量比未授权盗版多有点不爽233。。。
题意:求哪些点是割点,割掉以后能把图分成几块。
太水不欲发题解。
tarjan就好,不懂看代码。
代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 1005 using namespace std; int map[N][N]; bool exist[N]; int dfn[N],low[N],cnt; int stk[N],top; int d[N]; void init() { memset(d,0,sizeof(d)); memset(dfn,0,sizeof(dfn)); memset(map,0,sizeof(map)); memset(exist,0,sizeof(exist)); cnt=top=0; } void tarjan(int x,int p) { int v,temp; dfn[x]=low[x]=++cnt,stk[++top]=x; for(v=1;v<=1000;v++)if(map[x][v]&&v!=p) { if(!dfn[v]) { tarjan(v,x); low[x]=min(low[x],low[v]); if(dfn[x]<=low[v]) { do{ temp=stk[top--]; d[temp]++; }while(temp!=x);top++; } } else low[x]=min(low[x],dfn[v]); } return ; } int main() { int i,T=0; int a,b; while(scanf("%d",&a),a) { init(); int flag=1; printf("Network #%d\n",++T); do{ scanf("%d",&b); map[a][b]=map[b][a]=1; exist[a]=exist[b]=true; }while(scanf("%d",&a),a); for(i=1;i<=1000;i++)if(exist[i]&&!dfn[i])tarjan(i,0); for(i=1;i<=1000;i++)if(d[i]>=2) printf(" SPF node %d leaves %d subnets\n",i,d[i]),flag=0; if(flag)puts(" No SPF nodes"); puts(""); } return 0; }
时间: 2024-10-09 17:56:26