完全不解釋,就是一題裸的割點......
而且N才出到100,這題大概是在考你怎麼讀一行的數字吧......
#include<bits/stdc++.h> using namespace std; const int maxn=100+5; vector<int> G[maxn]; int iscut[maxn],pre[maxn],dfs_clock; int dfs(int now,int fa) { int lownow=pre[now]=++dfs_clock; int child=0; for(int i=0;i<G[now].size();i++) { int to=G[now][i]; if(!pre[to]) { child++; int lowto=dfs(to,now); lownow=min(lownow,lowto); if(lowto>=pre[now]) iscut[now]=1; } else if(pre[to]<pre[now] && to!=fa) lownow=min(lownow,pre[to]); } if(fa<0 && child<=1) iscut[now]=0; return lownow; } int main() { int N; while(scanf("%d",&N)==1 && N) { for(int i=1;i<=N;i++) G[i].clear(); int a,b; while(scanf("%d",&a) && a) { char c; c=getchar(); for(;c!='\n';) { b=0; for(;;) { c=getchar(); if(c==' ' || c=='\n') {G[b].push_back(a);G[a].push_back(b);break;} b=b*10+c-'0'; } } } dfs_clock=0; memset(pre,0,sizeof pre); memset(iscut,0,sizeof iscut); for(int i=1;i<=N;i++) if(!pre[i]) dfs(i,-1); int ans=0; for(int i=1;i<=N;i++) if(iscut[i]) ans++; printf("%d\n",ans); } }
沒有留言:
張貼留言