zoukankan      html  css  js  c++  java
  • 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
    ",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
    ");
    77     return 0;
    78 }
    View Code
  • 相关阅读:
    如何在Odoo创建新数据的时候添加自己的方法
    如何在odoo中实现隐藏原有菜单meum(3行代码实现)
    博客皮肤
    通过备份 Etcd 来完美恢复 Kubernetes 中的误删数据
    修改kubernetes-dashboard默认token认证时间
    Docker就该这么学--第一个dockerfile镜像文件
    nginx优化之网络服务模型
    nginx优化之nginx的进程与线程
    php的加载方式和设计模式
    nginx优化之nginx的配置文件详解
  • 原文地址:https://www.cnblogs.com/chen74123/p/7505124.html
Copyright © 2011-2022 走看看