//kosaraju #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<ctime> using namespace std; const int N=10005; int n,m,cnt,head[N],rhead[N],t,rt,q[N],top,ans,rcnt,Cnt[N],sum[N],number; bool vis[N],rvis[N]; struct Node{ int u,v,next; }edge[N]; struct rNode{ int u,v,next; }redge[N]; void push(int u,int v){ ++cnt; edge[cnt].u=u; edge[cnt].v=v; edge[cnt].next=head[u]; head[u]=cnt; } void rpush(int u,int v){ ++rcnt; redge[rcnt].u=u; redge[rcnt].v=v; redge[rcnt].next=rhead[u]; rhead[u]=rcnt; } void kosaraju(int u){ vis[u]=true; for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if(!vis[v]){ kosaraju(v); } } q[++top]=u; } void rkosaraju(int u){ vis[u]=true; Cnt[u]=t; sum[t]++; for(int i=rhead[u];i!=-1;i=redge[i].next){ int v=redge[i].v; if(!vis[v]){ rkosaraju(v); } else if(Cnt[u]!=Cnt[v]){ rvis[Cnt[v]]=false; } } } int main(){ memset(head,-1,sizeof(head)); memset(rhead,-1,sizeof(rhead)); memset(vis,false,sizeof(vis)); int u,v; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d",&u,&v); push(u,v); rpush(v,u); } for(int i=1;i<=n;i++){ if(!vis[i]){ kosaraju(i); } } memset(vis,false,sizeof(vis)); memset(rvis,true,sizeof(rvis)); for(int i=n;i>=1;i--){ if(!vis[q[i]]){ ++t; rkosaraju(q[i]); } } for(int i=1;i<=t;i++){ if(rvis[i]){ number++; ans=sum[i]; } } if(number!=1){ printf("0\n"); } else{ printf("%d",ans); } return 0; } //tarjan #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<ctime> using namespace std; const int N=50005; int n,m,cnt,head[N],dfn[N],low[N],t,q[N],top,number,num[N],sum,ans,Cnt[N],last[N]; bool vis[N]; struct Node{ int u,v,next; }edge[N]; void push(int u,int v){ ++cnt; edge[cnt].u=u; edge[cnt].v=v; edge[cnt].next=head[u]; head[u]=cnt; } void tarjan(int u){ dfn[u]=low[u]=++t; q[++top]=u; vis[u]=true; for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if(dfn[v]==-1){ tarjan(v); low[u]=min(low[u],low[v]); } if(vis[v]){ low[u]=min(low[u],dfn[v]); } } if(dfn[u]==low[u]){ sum++; for(;q[top+1]!=u&&top>0;){ Cnt[q[top]]=sum; num[sum]++; vis[q[top--]]=false; } } } int main(){ memset(head,-1,sizeof(head)); memset(dfn,-1,sizeof(dfn)); int u,v; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d",&u,&v); push(u,v); } for(int i=1;i<=n;i++){ if(dfn[i]==-1){ tarjan(i); } } for(int i=1;i<=n;i++){ for(int j=head[i];j!=-1;j=edge[j].next){ int v=edge[j].v; if(Cnt[i]!=Cnt[v]){ last[Cnt[i]]++; } } } for(int i=1;i<=sum;i++){ if(!last[i]){ number++; ans=num[i]; } } if(number>1){ printf("0\n"); } else{ printf("%d\n",ans); } return 0; }
来源:https://www.cnblogs.com/ukcxrtjr/p/11194251.html