题意:
给你一个无向图,你需要找出来其中有几个割点
代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<algorithm> 5 #include<queue> 6 using namespace std; 7 const int maxn=105; 8 int cnt,head[maxn],n,dfn[maxn],low[maxn],num,qua,root,iscut[maxn]; 9 struct edge10 {11 int u,v,next;12 }e[maxn*maxn];13 void add_edge(int x,int y)14 {15 e[cnt].u=x;16 e[cnt].v=y;17 e[cnt].next=head[x];18 head[x]=cnt++;19 }20 void tarjan(int x)21 {22 dfn[x]=low[x]=++num;23 int flag=0;24 for(int i=head[x];i!=-1;i=e[i].next)25 {26 int to=e[i].v;27 if(!dfn[to])28 {29 tarjan(to);30 low[x]=min(low[x],low[to]);31 if(low[to]>=dfn[x])32 {33 flag++;34 if(x!=root || flag>1) iscut[x]=1,qua++;35 } //一个割点可能会多次经历iscut[x]=1,所以qua里面的值不是割点数目36 }37 else low[x]=min(dfn[to],low[x]);38 }39 }40 int main()41 {42 while(~scanf("%d",&n) && n)43 {44 cnt=num=qua=0;45 memset(iscut,0,sizeof(iscut));46 memset(head,-1,sizeof(head));47 memset(dfn,0,sizeof(dfn));48 memset(low,0,sizeof(low));49 int x,y;50 char ch;51 while(~scanf("%d",&x) && x)52 {53 while(~scanf("%d",&y))54 {55 scanf("%c",&ch);56 add_edge(x,y);57 add_edge(y,x);58 if(ch==‘\n‘){59 break;60 }61 }62 }63 // for(int i=0;i<cnt;++i)64 // {65 // printf("%d %d\n",e[i].u,e[i].v);66 //67 // }68 for(int i=1;i<=n;++i)69 {70 if(!dfn[i])71 {72 //printf("**\n");73 root=i;74 tarjan(i);75 }76 }77 int ans=0;78 for(int i=1;i<=n;++i)79 if(iscut[i]) ++ans;80 printf("%d\n",ans);81 }82 return 0;83 }