Vijos 1626 爱在心中
爱在心中
tarjan缩点
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define maxn 1000000 4 int n,m,x,y,z,num,low[maxn],tim,cnt,q[maxn],t,ta,a[maxn]; 5 int dfn[maxn],point[maxn],color[maxn],Stack[maxn]; 6 int top,tot,ans,sumcol,head2[maxn],head[maxn],in[maxn],out[maxn]; 7 bool vis[maxn]; 8 9 struct Edge{ 10 int to,next,from; 11 }edge[maxn],edge2[maxn]; 12 13 void add(int u,int v) 14 { 15 edge[++num].to=v; 16 edge[num].from=u; 17 edge[num].next=head[u]; 18 head[u]=num; 19 } 20 21 void ins(int u,int v) 22 { 23 edge2[++tot].to=v; 24 edge2[tot].from=u; 25 edge2[tot].next=head[u]; 26 head2[u]=tot; 27 } 28 29 void tarjan(int x) 30 { 31 dfn[x]=low[x]=++tim; 32 Stack[++top]=x; vis[x]=true; 33 for(int i=head[x];i;i=edge[i].next) 34 { 35 int v=edge[i].to; 36 if(vis[v]) low[x]=min(low[x],dfn[v]); 37 else if(!dfn[v]) tarjan(v),low[x]=min(low[x],low[v]); 38 } 39 if(low[x]==dfn[x]) 40 { 41 sumcol++; color[x]=sumcol; point[sumcol]++; 42 for(;Stack[top]!=x;top--) 43 color[Stack[top]]=sumcol,point[sumcol]++,vis[Stack[top]]=false; 44 vis[x]=false; top--; 45 } 46 } 47 48 int main() 49 { 50 scanf("%d%d",&n,&m); 51 for(int i=1;i<=m;i++) 52 { 53 scanf("%d%d",&x,&y); 54 add(x,y); 55 } 56 for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i); 57 for(int u=1;u<=n;u++) 58 for(int i=head[u];i;i=edge[i].next) 59 if(color[u]!=color[edge[i].to]) 60 ins(color[u],color[edge[i].to]); 61 for(int i=1;i<=tot;i++) out[edge2[i].from]++; 62 for(int i=1;i<=sumcol;i++) 63 { 64 if(point[i]>1&&!out[i]) q[++t]=i; 65 if(point[i]>1) ans++; 66 } 67 printf("%d\n",ans); 68 if(t==1) 69 { 70 for(int i=1;i<=n;i++) 71 if(color[i]==q[t]) a[++ta]=i; 72 sort(a+1,a+ta+1); 73 for(int i=1;i<=ta;i++) 74 printf("%d ",a[i]); 75 } 76 else if(t!=1) printf("-1\n"); 77 return 0; 78 }