您的位置:首页 > 运维架构

POJ 2186 Popular Cows

2013-09-28 22:03 459 查看
http://poj.org/problem?id=2186

留个缩点模板

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: