POJ 2186 Popular Cows

Popular Cows

Time Limit: 2000ms

Memory Limit: 65536KB

This problem will be judged on PKU. Original ID: 2186
64-bit integer IO format: %lld      Java class name: Main

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

USACO 2003 Fall

解题:因为仰慕关系具有传递性,因此在一个强连通分量中的顶点:如果强连通分量中的一头牛A受到强连通分量外的另一头牛B的仰慕,则该强连通分量中的每头牛都受B仰慕。强连通缩点后,如果只有一个scc出度为0,则此scc中的点所有点的仰慕。如果多个,当然不存在任何点受其他仰慕了。因为一个scc中的点都是相互仰慕的。

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <stack>
 4 #include <cstring>
 5 using namespace std;
 6 const int maxn = 10010;
 7 int dfn[maxn],low[maxn],head[maxn],belong[maxn],scc,tot,idx;
 8 int outde[maxn];
 9 bool instack[maxn];
10 stack<int>stk;
11 struct arc{
12     int to,next;
13     arc(int x = 0,int y = -1){
14         to = x;
15         next = y;
16     }
17 }e[200000];
18 void add(int u,int v){
19     e[tot] = arc(v,head[u]);
20     head[u] = tot++;
21 }
22 void tarjan(int u){
23     dfn[u] = low[u] = idx++;
24     stk.push(u);
25     instack[u] = true;
26     for(int i = head[u]; ~i; i = e[i].next){
27         if(dfn[e[i].to] == -1){
28             tarjan(e[i].to);
29             low[u] = min(low[u],low[e[i].to]);
30         }else if(instack[e[i].to]) low[u] = min(low[u],dfn[e[i].to]);
31     }
32     if(dfn[u] == low[u]){
33         scc++;
34         int v;
35         do{
36             v = stk.top();
37             stk.pop();
38             instack[v] = false;
39             belong[v] = scc;
40         }while(v != u);
41     }
42 }
43 int main(){
44     int n,m,u,v;
45     while(~scanf("%d %d",&n,&m)){
46         memset(head,-1,sizeof(head));
47         memset(belong,0,sizeof(belong));
48         memset(dfn,-1,sizeof(dfn));
49         memset(low,-1,sizeof(low));
50         memset(outde,0,sizeof(outde));
51         while(!stk.empty()) stk.pop();
52         tot = scc = idx = 0;
53         for(int i = 0; i < m; ++i){
54             scanf("%d %d",&u,&v);
55             add(u,v);
56         }
57         for(int i = 1; i <= n; ++i)
58             if(dfn[i] == -1) tarjan(i);
59         for(int i = 1; i <= n; ++i)
60         for(int j = head[i]; ~j; j = e[j].next)
61             if(belong[i] != belong[e[j].to]) outde[belong[i]]++;
62         int ans = 0,p = 0;
63         for(int i = 1; i <= scc; ++i)
64             if(!outde[i]) p = i,ans++;
65         if(ans == 1){
66             ans = 0;
67             for(int i = 1; i <= n; ++i) if(belong[i] == p) ans++;
68             printf("%d\n",ans);
69         }else puts("0");
70     }
71     return 0;
72 }

时间: 2024-10-11 17:17:39

POJ 2186 Popular Cows的相关文章

poj 2186 Popular Cows 【强连通】

题目:poj 2186 Popular Cows 题意:n头牛,其中存在一些牛相互崇拜,具有传递性,问有多少头牛是被其他所有牛崇拜的. 分析:建立一个有向图,然后强连通缩点,之后求出度为0的点,假如存在多个,那么ans = 0,因为缩点之后如果x崇拜y,x也崇拜z,那么肯定y和z不能互相崇拜,不满足. 然后求出度为0的这个点缩点前环上有多少个点就ans AC代码: #include <cstdio> #include <vector> #include <iostream&g

POJ 2186 Popular Cows --强连通分量

题意:给定一个有向图,问有多少个点由任意顶点出发都能达到. 分析:首先,在一个有向无环图中,能被所有点达到点,出度一定是0. 先求出所有的强连通分支,然后把每个强连通分支收缩成一个点,重新建图,这样,这个有向图就变成了一个有向无环图. 在这个新的图中,只需知道出度为0的点有几个即可. 如果出度为0的点超过1个,则输出0:否则输出出度为0的点所代表的那个强连通分支的分量数即可. 用Tarjan求强连通分量 代码: #include <iostream> #include <cstdio&g

POJ 2186 Popular Cows (强连通分量)

POJ 2186 Popular Cows 链接:http://poj.org/problem?id=2186 题意:每头奶牛都梦想着成为牧群中最受奶牛仰慕的奶牛.在牧群中,有N 头奶牛,1≤N≤10,000,给定M 对(1≤M≤50,000)有序对(A, B),表示A 仰慕B.由于仰慕关系具有传递性,也就是说,如果A 仰慕B,B 仰慕C,则A 也仰慕C,即使在给定的M 对关系中并没有(A, C).你的任务是计算牧群中受每头奶牛仰慕的奶牛数量. 思路:首先可以知道,在同一个强连通分量内的点一定互

POJ 2186 Popular Cows -- tarjan 缩点

链接: POJ 2186 Popular Cows 题意: 每一头牛都希望在牛群里面备受瞩目,在一个牛群中有N头牛(1<=N<=10000),你被给予M(1<=M<=50000)个关系对,形式如(A,B),这意味着A牛认为B牛比它更受欢迎,由于这种欢迎度是满足传递性的,那么若是A牛认为B牛更受欢迎,B牛认为C牛更受欢迎,那么A牛也会认为C牛更受欢迎.你的任务是计算出被所有牛受欢迎的牛的个数. 输入: 第一行两个整数 N 和 M 第2 到 M + 1 行,两个分开的数 A,B,意味着

Poj 2186 Popular Cows (Tarjan)

题目链接: Poj 2186 Popular Cows 题目描述: 有n只牛,牛之间存在一些关系,比如a认为b很受欢迎,b认为c很受欢迎,这样呢,a也会认为c很受欢迎,问根据给出的关系,有多少头牛被其他所有的牛都认为是受欢迎的? 解题思路: 对于一个有向无环图来说,其中有且仅有一个点出度为零,那么这个特殊的点,可以由其他任何点到达.那么接下来我们直接对所给的图进行强连通分量划分,然后把每个强连通分量看做一个点,判定出度为零的点有几个,如果有一个就输出这个点对应的强连通分量含有的节点个数,否则为零

强连通分量分解 Kosaraju算法 (poj 2186 Popular Cows)

poj 2186 Popular Cows 题意: 有N头牛, 给出M对关系, 如(1,2)代表1欢迎2, 关系是单向的且可以传递, 即1欢迎2不代表2欢迎1, 但是如果2也欢迎3那么1也欢迎3. 求被所有牛都欢迎的牛的数量. 限制: 1 <= N <= 10000 1 <= M <= 50000 思路: Kosaraju算法, 看缩点后拓扑序的终点有多少头牛, 且要判断是不是所有强连通分量都连向它. Kosaraju算法,分拆完连通分量后,也完成了拓扑序. /*poj 2186

POJ 2186 Popular Cows (强联通)

id=2186">http://poj.org/problem? id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 23819   Accepted: 9767 Description Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= N <=

poj 2186 Popular Cows 【强连通分量Tarjan算法 + 树问题】

题目地址:http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27496   Accepted: 11059 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

Poj 2186 Popular Cows(Tarjan 强连通缩点)

传送门:Poj 2186 题意:给你n头牛,m种关系,A牛认为B牛是popular的,B牛认为C牛是popular的,则A也认为C是popular的,问最终有几头被所有牛认为是popular的牛 题解:强连通缩点基础题(虽然我Tarjan和缩点都是对的,但是最终讨论判断的时候写垮了(写了3天....还不是你懒!!!!过年划水这么多天缩点后找出度为零的点个数.然后讨论是否有这样子的点,如果没有则全都是(整个都是强连通图),如果只有一个,那么那个强连通分量所含的牛的个数就是所求解,如果有多个那么都是