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 }
View Code

 

posted @ 2017-09-11 15:11  Alex丶Baker  阅读(77)  评论(0编辑  收藏  举报