zoukankan      html  css  js  c++  java
  • 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
    ",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;
    }
  • 相关阅读:
    0909 初识编译原理
    校园跳蚤市场-Sprint计划
    校园跳蚤市场
    5.2-5.3
    5.1封装
    阅读2
    汉堡包
    五章-问题
    结对子作业 四则运算 V2.0
    四则运算升级版
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11162576.html
Copyright © 2011-2022 走看看