题目描述:
#include<cstdio> #include<cstring> int idx,ans2,low[50001],deep[50001],idx2,cnt,last[50001],x[50001],y[50001],z[50001],top,f[50001],ans[50001],num[50001],n,m; bool inz[50001]; struct edge { int to,next; }e[50001]; int min(int a,int b) { if(a<b) return a; return b; } void addage(int x,int y) { e[++idx].to=y; e[idx].next=last[x]; last[x]=idx; } void tarjan(int x) { low[x]=deep[x]=++cnt; z[++top]=x; inz[x]=1; for(int i=last[x];i>=0;i=e[i].next) { if(!deep[e[i].to]) { tarjan(e[i].to); low[x]=min(low[x],low[e[i].to]); } else if(inz[e[i].to]&&low[x]>deep[e[i].to]) low[x]=deep[e[i].to]; } if(low[x]==deep[x]) { idx2++; int t=-1; while(x!=t) { t=z[top--]; ans[idx2]++; f[t]=idx2; inz[t]=0; } } } int main() { scanf("%d%d",&n,&m); memset(last,-1,sizeof(last)); for(int i=1;i<=m;i++) { scanf("%d%d",&x[i],&y[i]); addage(x[i],y[i]); } for(int i=1;i<=n;i++) if(!deep[i]) tarjan(i); for(int i=1;i<=m;i++) if(f[x[i]]!=f[y[i]]) num[f[x[i]]]++; for(int i=1;i<=idx2;i++) if(!num[i]) { if(ans2) { printf("0"); return 0; } ans2=i; } printf("%d",ans[ans2]); }
原文:https://www.cnblogs.com/jiangminghong/p/9816645.html