tarjan,叙叙旧咯
#include<cstdio>
#define maxn 50005
int
e[maxn],ne[maxn],be[maxn],all;
int
DFN[maxn],LOW[maxn],stack[maxn],curr,stak;
bool instack[maxn];
int
num,belong[maxn],out[maxn],ans;
void add(int a,int b){
e[++all]=b;
ne[all]=be[a];
be[a]=all;
}
void tarjan(int p){
int
j;
DFN[p]=LOW[p]=++curr;
instack[p]=true;
stack[++stak]=p;
for(j=be[p];j!=0;j=ne[j])
if(!DFN[e[j]]){
tarjan(e[j]);
if(LOW[e[j]]<LOW[p])
LOW[p]=LOW[e[j]];
}
else
if(instack[e[j]]&&DFN[e[j]]<LOW[p])
LOW[p]=DFN[e[j]];
if(LOW[p]==DFN[p]){
++num;
do{
j=stack[stak--];
belong[j]=num;
instack[j]=false;
}
while (j!=p);
}
}
void
solve(int n){
curr=stak=num=0;//curr当前次序 stak栈容量 num队伍号码
for(int
i=1;i<=n;i++)
if(!DFN[i]) tarjan(i);
}
int main()
{
int i,j,n,m,a,b;
scanf("%d%d",&n,&m);
for(i=0;i<m;i++){
scanf("%d%d",&a,&b);
add(a,b);
}
solve(n);
for(i=1;i<=n;i++)
for(j=be[i];j!=0;j=ne[j])
if(belong[e[j]]!=belong[i])
++out[belong[i]];
for(i=1;i<=num;i++)
if(out[i]==0)
ans++;
if(ans==1){
ans=0;
for(i=1;i<=num;i++)
if(out[i]==0)
for(j=1;j<=n;j++)
if(belong[j]==i) ++ans;
printf("%d",ans);
}else printf("0");
return 0;
}
纯tarjan poj2186,布布扣,bubuko.com
原文:http://www.cnblogs.com/Mathics/p/3758135.html