强连通分量[trajan]
http://poj.org/problem?id=2186
View Code
const int MM = 11111; #define debug puts("wrong") typedef __int64 int64; int N,M; vector<int>edge[MM]; const int maxn = 11111; //节点数 bool instack[maxn]; int ief,top,bcnt,st[maxn]; int low[maxn],dfn[maxn],belong[maxn]; int out[MM]; void get_data() { int i,j,k,x,y; for(i=0;i<=N;i++) edge[i].clear(); for(i=0;i<M;i++) { scanf("%d%d",&x,&y); edge[x].push_back(y); } } void get_init(int n) { //节点数 for(int i=0;i<=n;i++) low[i]=dfn[i]=instack[i]=belong[i]=0; top=bcnt=0; ief=1; } void trajan(int u) { int i,j,k,v; dfn[u]=low[u]=ief++; st[top++]=u; instack[u]=true; for(i=0;i<edge[u].size();i++) { v=edge[u][i]; if(!dfn[v]) trajan(v); if(low[u]>low[v]) low[u]=low[v]; else if(instack[v] && dfn[v]<low[u]) low[u]=dfn[k]; } if(low[u]==dfn[u]) { bcnt++; do { v=st[--top]; instack[v]=false; belong[v]=bcnt; }while(u!=v); } } int get_ans(int x) { int res=0; for(int i=1;i<=N;i++) if(belong[i]==x) res++; return res; } void solve() { int i,j,k,v; get_init(N); for(i=1;i<=N;i++) if(!dfn[i]) trajan(i); for(i=1;i<=N;i++) out[i]=0; for(i=1;i<=N;i++) { for(j=0;j<edge[i].size();j++) { v=edge[i][j]; if(belong[i]!=belong[v]) out[belong[i]]++; } } int res,cc=0; for(i=1;i<=bcnt;i++) if(!out[i]) cc++,res=i; if(cc>1) puts("0"); else printf("%d\n",get_ans(res)); }