模板题,注意输出
#include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> #include <vector> #include <stack> using namespace std; typedef long long LL; const int N = 1e2+5; int head[N],tot,n; struct Edge{ int v,next; }edge[N*N]; bool iscut[N]; void add(int u,int v){ edge[tot].v=v; edge[tot].next=head[u]; head[u]=tot++; } int dfn[N],low[N],clk; void targin(int u,int f){ dfn[u]=low[u]=++clk; int child=0; for(int i=head[u];~i;i=edge[i].next){ int v=edge[i].v; if(v==f)continue; if(!dfn[v]){ ++child; targin(v,u); low[u]=min(low[u],low[v]); if(f!=-1&&low[v]>=dfn[u])iscut[u]=true; } else if(dfn[v]<low[u])low[u]=dfn[v]; } if(f==-1&&child>1)iscut[u]=true; } int main(){ while(~scanf("%d",&n),n){ memset(head,-1,sizeof(head));clk=tot=0; for(int u;;){ scanf("%d",&u); if(!u)break; for(int v;;){ scanf("%d",&v); add(u,v); add(v,u); char c=getchar(); if(c==‘\n‘)break; } } memset(iscut,false,sizeof(iscut)); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); for(int i=1;i<=n;++i) if(!dfn[i])targin(i,-1); int ans=0; for(int i=1;i<=n;++i) if(iscut[i])++ans; printf("%d\n",ans); } return 0; }
时间: 2024-10-06 02:33:02