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 <= 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

题意:

一群牛中找被其它全部牛觉得是受欢迎的牛的数量。当中受欢迎有传递性。比方A觉得B受欢迎。B觉得C受欢迎,那么A觉得C也是受欢迎的。

分析:

假设某头牛是受欢迎的。那么从其它全部牛出发都能到达这头牛。假设用搜索做似乎太过复杂。首先进行强联通缩点。这样得到一个DAG,假设该DAG有且仅有一个出度为0的缩点点(极大强联通分量),那么这个缩点包含的牛的数量即为答案。

/*
*
* Author : fcbruce <fcbruce8964@gmail.com>
*
* Time : Tue 14 Oct 2014 03:00:16 PM CST
*
*/
#include <cstdio>
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <algorithm>
#include <ctime>
#include <cctype>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <queue>
#include <list>
#include <vector>
#include <map>
#include <set>
#define sqr(x) ((x)*(x))
#define LL long long
#define itn int
#define INF 0x3f3f3f3f
#define PI 3.1415926535897932384626
#define eps 1e-10 #ifdef _WIN32
#define lld "%I64d"
#else
#define lld "%lld"
#endif #define maxm 50007
#define maxn 10007 using namespace std; int n,m;
int fir[maxn];
int u[maxm],v[maxm],nex[maxm];
int e_max; int pre[maxn],low[maxn],sccno[maxn],w[maxn];
int st[maxn],top;
int scc_cnt,dfs_clock; int deg[maxn]; inline void add_edge(int s,int t)
{
int e=e_max++;
u[e]=s;v[e]=t;
nex[e]=fir[u[e]];fir[u[e]]=e;
} void tarjan_dfs(int s)
{
pre[s]=low[s]=++dfs_clock;
st[++top]=s;
for (int e=fir[s];~e;e=nex[e])
{
int t=v[e];
if (pre[t]==0)
{
tarjan_dfs(t);
low[s]=min(low[s],low[t]);
}
else
{
if (sccno[t]==0)
low[s]=min(low[s],pre[t]);
}
} if (pre[s]==low[s])
{
scc_cnt++;
for (;;)
{
int x=st[top--];
sccno[x]=scc_cnt;
w[scc_cnt]++;
if (x==s) break;
}
}
} void find_scc()
{
top=-1;
scc_cnt=dfs_clock=0;
memset(pre,0,sizeof pre);
memset(low,0,sizeof low);
memset(w,0,sizeof w);
for (int i=1;i<=n;i++)
if (pre[i]==0) tarjan_dfs(i);
} int main()
{
#ifdef FCBRUCE
freopen("/home/fcbruce/code/t","r",stdin);
#endif // FCBRUCE scanf("%d%d",&n,&m); e_max=0;
memset(fir,-1,sizeof fir); for (int e=0,u,v;e<m;e++)
{
scanf("%d%d",&u,&v);
add_edge(u,v);
} find_scc(); memset(deg,0,sizeof deg); for (int e=0;e<e_max;e++)
{
if (sccno[u[e]]==sccno[v[e]]) continue;
deg[sccno[u[e]]]++;
} int cnt=0,the_one; for (int i=1;i<=scc_cnt;i++)
{
if (deg[i]==0)
{
cnt++;
the_one=i;
}
} if (cnt==1) printf("%d\n",w[the_one]);
else puts("0"); return 0;
}

POJ 2186 Popular Cows (强联通)的更多相关文章

  1. POJ 2186 Popular Cows(强联通分量)

    题目链接:http://poj.org/problem?id=2186 题目大意:    每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种 ...

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

    poj 2186 Popular Cows 题意: 有N头牛, 给出M对关系, 如(1,2)代表1欢迎2, 关系是单向的且能够传递, 即1欢迎2不代表2欢迎1, 可是假设2也欢迎3那么1也欢迎3. 求 ...

  3. poj 2186 Popular Cows (强连通分量+缩点)

    http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissi ...

  4. tarjan缩点练习 洛谷P3387 【模板】缩点+poj 2186 Popular Cows

    缩点练习 洛谷 P3387 [模板]缩点 缩点 解题思路: 都说是模板了...先缩点把有环图转换成DAG 然后拓扑排序即可 #include <bits/stdc++.h> using n ...

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

    题目地址:http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Sub ...

  6. POJ 2186 Popular cows(Kosaraju+强联通分量模板)

    题目链接:http://poj.org/problem?id=2186 题目大意:给定N头牛和M个有序对(A,B),(A,B)表示A牛认为B牛是红人,该关系具有传递性,如果牛A认为牛B是红人,牛B认为 ...

  7. POJ 2186 Popular Cows(强联通+缩点)

    Description Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= ...

  8. [强连通分量] POJ 2186 Popular Cows

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 31815   Accepted: 12927 De ...

  9. POJ 2186 Popular Cows(强连通分量缩点)

    题目链接:http://poj.org/problem?id=2186 题目意思大概是:给定N(N<=10000)个点和M(M<=50000)条有向边,求有多少个“受欢迎的点”.所谓的“受 ...

随机推荐

  1. HttpComponents 也就是以前的httpclient项目

    HttpComponents 也就是以前的httpclient项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端/服务器编程工具包,并且它支持 HTTP 协议最新的版本和建议.不 ...

  2. leetcode第一刷_Maximal Rectangle

    这个题比刚才那个更难. 假设没做过上一个,这个简直是无情. 先想一个笨笨的解法,如何确定一个矩形呢?找一个左上角,然后每行的看能延伸到什么位置.注意随着行数的添加,列数是仅仅能变短,不能变长. 想一下 ...

  3. Use Node.js DDP Client on Arduino Yun to Access Meteor Server

    Use Node.js DDP Client on Arduino Yun to Access Meteor Server 概述 在Arduino Yun上安装 Node.js, 并測试与 Meteo ...

  4. opencv保存视频

    利用opencv提供的方法,从摄像头获取视频,并保存为.avi格式文件. win8.1,opencv248,vs2013下测试 #include<opencv\cv.h> #include ...

  5. BZOJ 4177: Mike的农场( 最小割 )

    显然是最小割... 对于规律(i, j, k) i,j 互相连边, 容量为k 对于规则(S, a, b) 新建一个点x, x与S中每个点连一条弧, 容量+∞, 然后再根据a决定x与源点或汇点连边. 跑 ...

  6. ZOJ 3607贪心算法

    http://blog.csdn.net/ffq5050139/article/details/7832991 http://blog.watashi.ws/1944/the-8th-zjpcpc/ ...

  7. Python 绝对简明手册

    Python 绝对简明手册 help(函数名)来获取相关信息 另外,自带的文档和google也是不可少的 2. 基本语法2.1. if / elif / else x=int(raw_input(&q ...

  8. Android 播放声音

    public static void PlayAlarmRing(Context mContext) { Uri alert = RingtoneManager.getDefaultUri(Ringt ...

  9. 分享非常有用的Java程序(关键代码)(七)---抓屏程序

    原文:分享非常有用的Java程序(关键代码)(七)---抓屏程序 import java.awt.Dimension; import java.awt.Rectangle; import java.a ...

  10. hdu 4614 Vases and Flowers (二分 线段树)

    题目大意:爱丽丝有N个花瓶,每个花瓶最多放一朵花.然后又如下两个操作. 1:A B    从第A个花瓶开始,往后依次插B朵花,直到不能插为止.如果一朵花都不能插入就输出“can.....”,否则输出第 ...