zoukankan      html  css  js  c++  java
  • poj2186 Popular Cows

    Popular Cows
    Time Limit: 2000MS   Memory Limit: 65536K
    Total Submissions: 20718   Accepted: 8438

    Description

    Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= 10,000) cows, you are given up to M (1 <= M <= 50,000) ordered pairs of the form (A, B) that tell you that cow A thinks that cow B is popular. Since popularity is transitive, if A thinks B is popular and B thinks C is popular, then A will also think that C is
    popular, even if this is not explicitly specified by an ordered pair in the input. Your task is to compute the number of cows that are considered popular by every other cow.

    Input

    * Line 1: Two space-separated integers, N and M

    * Lines 2..1+M: Two space-separated numbers A and B, meaning that A thinks B is popular.

    Output

    * Line 1: A single integer that is the number of cows who are considered popular by every other cow.

    Sample Input

    3 3
    1 2
    2 1
    2 3
    

    Sample Output

    1
    

    Hint

    Cow 3 is the only cow of high popularity.

    Source

    先求强连通分量,缩点之后,如果出度为0的只有一个,那个结果自然是这个缩点的点数,如果为0的大于1,则一定不连通,所以直接输出0就可以了!
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define N 10510
    #define E 100000
    #define M 1000000
    using namespace std;
    int head[N],sta[M],num[N],re,ans,next[E],id[N],in[N],vec[E],vis[N],dfn[N],low[N],clock_m,edge_m;
    int addedge(int s,int e){
        vec[edge_m]=e;next[edge_m]=head[s];head[s]=edge_m++;
    }
    int init(){
        memset(vis,0,sizeof(vis));
        memset(dfn,0,sizeof(dfn));
        memset(low,0,sizeof(low));
        memset(num,0,sizeof(num));
        memset(head,-1,sizeof(head));
        memset(id,0,sizeof(id));
        memset(in,0,sizeof(in));
        edge_m=0;clock_m=0;ans=0;re=0;
    }
    int tarjan(int x){
        dfn[x]=low[x]=++clock_m;
        sta[++ans]=x;
        vis[x]=1;
        for(int i=head[x];i!=-1;i=next[i]){
            int goal=vec[i];
            if(!dfn[goal]){
                tarjan(goal);
                low[x]=min(low[x],low[goal]);
            }
            else if(/*vis[goal]*/!id[goal])
                low[x]=min(low[x],dfn[goal]);
        }
        if(low[x]==dfn[x]){
            re++;int v;
           do{
                v=sta[ans--];vis[v]=0;num[re]++;id[v]=re;
            }while(v!=x);
        }
        return 1;
    }
    int main()
    {
        int tcase,n,m,s,e;
    
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            //system("PAUSE");
            init();
            for(int i=0;i<m;i++){
                scanf("%d%d",&s,&e);
                addedge(s,e);
            }
            for(int i=1;i<=n;i++)
            if(!dfn[i])
            {
               tarjan(i);
            }
            for(int i=1;i<=n;i++){
                for(int j=head[i];j!=-1;j=next[j]){
                    if(id[vec[j]]!=id[i]){
                        in[id[i]]++;
                    }
                }
            }
            ans=0;int k=1;
            for(int i=1;i<=re;i++){
                if(in[i]==0){
                sta[ans++]=i;k=i;
                }
            }
            if(ans>1)printf("0
    ");
            else printf("%d
    ",num[k]);
    
        }
        return 0;
    }
    


  • 相关阅读:
    codeforces 732D
    我的ubuntu配置
    周末实在无聊,自己写了一遍被人写烂了的“贪吃蛇”,欢迎各位新手低手高手老手前来吐槽哈哈
    两种方式实现点击列表弹出列表索引
    浅谈javascript中原型(prototype)、构造函数、对象实例及三者之间的关系
    写了个超级简单的“进度条”的demo,供新手参考,高手吐槽!
    javascript 使用 NodeList主意的问题
    js中的“||”和“&&”
    javascript call函数实现继承时遇到的问题
    javascript 解决innerText浏览器兼容
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3331244.html
Copyright © 2011-2022 走看看