标签:
Description
Input
Output
Sample Input
5 5 1 2 3 4 0 6 2 1 3 5 4 6 2 0 0
Sample Output
1 2
Hint
#include<iostream> #include<cstdio> #include<cmath> #include<string> #include<queue> #include<algorithm> #include<stack> #include<cstring> #include<vector> #include<list> #include<set> #include<map> using namespace std; #define ll long long #define mod 1000000007 #define inf 999999999 int scan() { int res = 0 , ch ; while( !( ( ch = getchar() ) >= ‘0‘ && ch <= ‘9‘ ) ) { if( ch == EOF ) return 1 << 30 ; } res = ch - ‘0‘ ; while( ( ch = getchar() ) >= ‘0‘ && ch <= ‘9‘ ) res = res * 10 + ( ch - ‘0‘ ) ; return res ; } int dfn[1010]; int low[1010]; int head[1010]; int ans[1010]; int visit[1010]; int index,root,son,node,jiedge; struct is { int u,v; int next; }edge[1010]; void add(int x,int y) { jiedge++; edge[jiedge].u=x; edge[jiedge].v=y; edge[jiedge].next=head[x]; head[x]=jiedge; jiedge++; edge[jiedge].u=y; edge[jiedge].v=x; edge[jiedge].next=head[y]; head[y]=jiedge; } void dfs(int u) { for(int i=head[u];i;i=edge[i].next) { int v=edge[i].v; if(visit[v]==0) { visit[v]=1;++index; dfn[v]=low[v]=index; dfs(v); low[u]=min(low[u],low[v]); if(low[v]>=dfn[u]) { if(u==root) son++; else ans[u]++; } } else low[u]=min(low[u],dfn[v]); } } void trajan() { memset(visit,0,sizeof(visit)); memset(ans,0,sizeof(ans)); index=1; root=1; son=0; low[1]=dfn[1]=1; visit[1]=1; dfs(1); } int main() { int u,v; int flag=0; while(scanf("%d",&node)!=EOF) { memset(head,0,sizeof(head)); jiedge=0; if(node==0)break; while(1) { int u,v; scanf("%d",&u); if(!u)break; while(getchar()!=‘\n‘) { scanf("%d",&v); add(u,v); } } trajan(); int answer=0; if(son>1) answer++; for(int i=2;i<=node;i++) if(ans[i]) answer++; printf("%d\n",answer); } return 0; }
标签:
原文地址:http://www.cnblogs.com/jhz033/p/5380806.html