• POJ2186:Popular Cows(tarjan+缩点)


    题目解析:

      这题题意没什么好说的,解法也挺简单的,只要会tarjan算法+只有一个出度为0的强连通分量题目有解这题就迎刃而解了。

    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    #include <algorithm>
    #define N 100002
    using namespace std;
    int n,m,tt,time,cnt,e,a[N],b[N],sum[N];
    struct node
    {
        int x,y;
        int next;
    } eg[1000001];
    int head[N],low[N],dfn[N],f[N],instack[N],belong[N],s[N];
    void init()
    {
        memset(head,-1,sizeof(head));
        memset(instack,0,sizeof(instack));
        memset(belong,0,sizeof(belong));
        memset(sum,0,sizeof(sum));
        memset(f,0,sizeof(f));
        tt=0;
        cnt=0;
    }
    void add(int xx,int yy)
    {
        eg[tt].x=xx;
        eg[tt].y=yy;
        eg[tt].next=head[xx];
        head[xx]=tt++;
    }
    void tarjan(int i)
    {
        int w;
        dfn[i]=low[i]=++time;
        instack[i]=1;
        s[++e]=i;
        for(int j=head[i]; j!=-1; j=eg[j].next)
        {
            w=eg[j].y;
            if(!dfn[w])
            {
                tarjan(w);
                low[i]=min(low[i],low[w]);
            }
            else if(instack[w]==1)
            {
                low[i]=min(low[i],dfn[w]);
            }
        }
        if(dfn[i]==low[i])
        {
            cnt++;
            do
            {
                w=s[e--];
                instack[w]=0;
                belong[w]=cnt;
            }
            while(w!=i);
        }
    }
    void solve()
    {
        time=e=0;
        memset(dfn,0,sizeof(dfn));
        for(int i=1; i<=n; i++)
        {
            if(!dfn[i])
            {
                tarjan(i);
            }
        }
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            init();
            for(int i=1; i<=m; i++)
            {
                scanf("%d%d",&a[i],&b[i]);
                add(a[i],b[i]);
            }
            solve();
            for(int i=1; i<=m; i++)
            {
                if(belong[a[i]]!=belong[b[i]])
                {
                    f[belong[a[i]]]=1;
                }
            }
            for(int i=1; i<=n; i++)
            {
                sum[belong[i]]++;
            }
            int V=0,count;
            for(int i=1; i<=cnt; i++)
            {
                if(!f[i])
                {
                    V++;
                    count=sum[i];
                }
            }
            if(V==1) printf("%d
    ",count);
            else printf("0
    ");
        }
        return 0;
    }
  • 相关阅读:
    CentOS7 防火墙firewalld详细操作
    bootstrap-datetimepicker 滚动错位问题
    Contos更换python版本
    centos7.3下使用yum 安装pip
    备注
    jenkins与SVN 问题记录
    kafka配置
    Jenkins 与github配置
    nginx File not found 错误
    nginx 总结
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/4025210.html
Copyright © 2020-2023  润新知