VIJOS-P1626 爱在心中
VIJOS-P1626 爱在心中
JDOJ 1588
https://neooj.com/oldoj/problem.php?id=1588
TARJAN求强连通分量的模板题
AC代码
#include<cstdio> #include<algorithm> using namespace std; int n,m,ans,sum; int tot,to[10001],nxt[10001],head[1001]; int rudu[1001],chudu[1001]; int z[1001],inz[1001],v[1001],deep[1001],low[1001],belong[1001],top,cnt; int f[1001][1001]; void add(int x,int y) { to[++tot]=y; nxt[tot]=head[x]; head[x]=tot; } void tarjan(int x) { z[++top]=x; v[x]=1; inz[x]=1; deep[x]=low[x]=++cnt; for(int i=head[x];i;i=nxt[i]) { int y=to[i]; if(v[y]==0) { tarjan(y); low[x]=min(low[x],low[y]); } else if(inz[y]==1) low[x]=min(low[x],deep[y]); } if(deep[x]==low[x]) { ans++; int t; do { t=z[top--]; inz[t]=0; f[ans][++f[ans][0]]=t; belong[t]=ans; }while(t!=x); } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); add(a,b); rudu[b]++; } for(int i=1;i<=n;i++) if(v[i]==0) tarjan(i); for(int i=1;i<=ans;i++) if(f[i][0]!=1) sum++; printf("%d\n",sum); for(int i=1;i<=n;i++) for(int j=head[i];j;j=nxt[j]) if(belong[i]!=belong[to[j]]) chudu[belong[i]]++; sum=0; int pos; for(int i=1;i<=ans;i++) if(chudu[i]==0) sum++,pos=i; if(sum!=1 || f[pos][0]==1) printf("-1"); else { int a=f[pos][0]; f[pos][0]=0; sort(f[pos]+1,f[pos]+a+1); for(int i=1;i<=a;i++) printf("%d ",f[pos][i]); } return 0; }