• BZOJ 1051: [HAOI2006]受欢迎的牛


    1051: [HAOI2006]受欢迎的牛

    >原题链接<

    Description

      每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这
    种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头
    牛被所有的牛认为是受欢迎的。

    Input

      第一行两个数N,M。 接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可能重复,即有可
    能出现多个A,B)

    Output

      一个数,即有多少头牛被所有的牛认为是受欢迎的。

    Sample Input

    3 3
    1 2
    2 1
    2 3

    Sample Output

    1

    思路:

      分析题意,即找一些牛受所有牛欢迎,即所有牛可以到达它。对这张有向图进行一次Tarjan,并查找出度为0的的点,若有两个出度为0的点,显然答案就是0,若只有一个点,则答案是这个点所在强连通分量的点的数量。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <iostream>
    #include <queue>
    #include <stack>
    using namespace std;
    const int N = 10010, M = 10010 * 10;
    int next[M],to[M],head[N]; 
    int dfn[N], low[N];
    int otd[N],id[N],all[N];
    bool vis[N];
    int cnt,tot,n,m,col;
    stack<int>s;
    void add_edge(int x,int y) {
        to[++cnt]=y;
        next[cnt]=head[x];
        head[x]=cnt;
    }
    void Tarjan(int p) {
        dfn[p]=low[p]=++tot;
        s.push(p); vis[p]=1;
        int i;
        for(i=head[p];i;i=next[i]) {
            if(!dfn[to[i]]) {
                Tarjan(to[i]);
                low[p]=min(low[p],low[to[i]]);
            }
            else if(vis[to[i]]) {
                low[p]=min(low[p],dfn[to[i]]);
            }
        }
        
        if(low[p]==dfn[p]) {
            col++;
            do {
                i=s.top(),s.pop();
                vis[i]=0;
                id[i]=col;all[col]++;
            }while(p!=i);
        }
    }
    int main() {
        scanf("%d%d",&n,&m);
        int i,x,y,j;
        for(i=1;i<=m;i++) {
            scanf("%d%d",&x,&y);
            add_edge(x,y);
        }
        for(i=1;i<=n;i++) {
            if(!dfn[i])Tarjan(i);
        }
        for(i=1;i<=n;i++) {
            for(j=head[i];j;j=next[j]) {
                if(id[i]!=id[to[j]])
                    otd[id[i]]++;
            }
        }
        int rt=0;
        for(i=1;i<=col;i++) {
            if(!otd[i]) {
                if(rt) {
                    puts("0");
                    return 0;
                }
                rt=i;
            }
        }
        printf("%d
    ",all[rt]);
    
    }
    

     >原文链接<

  • 相关阅读:
    ProtoType Design Tools
    什么是publickeytoken及publickeytoken的作用
    Windows最高权限system帐户
    Q70 AV01本本安装MAC
    解决MDict3在PPC下乱码的问题
    QT_XSP.CPP
    QT_XSP.CPP
    SetupFactory脚本
    DVD IFO FILE HEADER
    SerialPort comstat is being used without defining
  • 原文地址:https://www.cnblogs.com/Tobichi/p/9112855.html
Copyright © 2020-2023  润新知