poj 1523 tarjan求割点

来源:互联网 发布:淘宝上买iphone店铺 编辑:程序博客网 时间:2024/04/30 01:52

题意:求割点,并求割点将原图分成几个连通分量

思路:tarjan算法。如果一个节点(非起始点)从它的一条后向边无法到达任何已然标号的点,则此点为割点。

#include <stdio.h>#include <string.h>#define N 1005int first[N],dfn[N],low[N],res[N],visited[N];struct edge{int y,next;}e[N*N];int root,x,y,T=1,top,index;void init(){top = index = 0;memset(dfn,-1,sizeof(dfn));memset(first,-1,sizeof(first));memset(low,0,sizeof(low));memset(res,0,sizeof(res));memset(visited,0,sizeof(visited));}void add(int x,int y){e[top].y = y;e[top].next = first[x];first[x] = top++;}int min(int a,int b){if(a<b)return a;return b;}void tarjan(int i){int j,num=0;dfn[i] = low[i] = index++;visited[i] = 1;for(j = first[i];j!=-1;j=e[j].next){if(dfn[e[j].y] == -1){tarjan(e[j].y);low[i] = min(low[i],low[e[j].y]);if(low[e[j].y] >= dfn[i] && i!=root)res[i]++;else if(i == root)res[i]++;}elselow[i] = min(low[i],dfn[e[j].y]);}}int main(){freopen("a.txt","r",stdin);while(scanf("%d",&root) && root){int i,flag = 0;init();scanf("%d",&y);add(root,y);add(y,root);scanf("%d",&x);while(x){scanf("%d",&y);add(x,y);add(y,x);scanf("%d",&x);}tarjan(root);res[root]--;printf("Network #%d\n",T++);for(i = 1;i<N;i++)if(res[i]){printf("  SPF node %d leaves %d subnets\n",i,1+res[i]);flag = 1;}if(!flag)printf("  No SPF nodes\n");putchar('\n');}return 0;}


0 0