纯tarjan poj2186

时间:2023-03-08 18:51:08

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;
}