http://poj.org/problem?id=2186
留个缩点模板
Code#include <iostream> #include <vector> #include <stack> #include <cstring> using namespace std; const int maxn=10000+10; int Index=0,cnt=0,N,M,DFN[maxn],Low[maxn],belong[maxn],d[maxn]; bool InS[maxn]; vector<int> G[maxn]; stack <int> S; int Tarjan(int u) { DFN[u]=Low[u]=++Index; S.push(u);InS[u]=1; vector<int>::iterator ite; for(ite=G[u].begin();ite!=G[u].end();ite++){ if(!DFN[*ite]){ Tarjan(*ite); Low[u]=min(Low[u],Low[*ite]); } else{if(InS[*ite])Low[u]=min(Low[u],DFN[*ite]);} } if(Low[u]==DFN[u]){ cnt++;int i;//cout<<"cnt="<<cnt<<endl; do{ i=S.top();S.pop(); belong[i]=cnt; InS[i]=0; //cout<<" "<<i<<endl; }while(i!=u); } //cout<<"========="<<endl; return 0; } int main() { ios::sync_with_stdio(0); cin>>N>>M; memset(DFN,0,sizeof(DFN)); memset(InS,0,sizeof(InS)); for(int i=0;i<M;i++){ int A,B;cin>>A>>B; G[A].push_back(B); } for(int i=0;i<N;i++) if(!DFN[i+1])Tarjan(i+1); vector<int>::iterator ite; for(int i=0;i<N;i++) for(ite=G[i+1].begin();ite!=G[i+1].end();ite++) if(belong[i+1]!=belong[*ite]) d[belong[i+1]]++; int ID=-1,ans=1; for(int i=0;(i<N)&&(ans>=0);i++) if(!d[belong[i+1]]){ if(ID<0) ID=belong[i+1]; else { if(belong[i+1]!=ID) ans=-1; else ans++; } } cout<<max(ans,0)<<endl; return 0; }