PKU2186 Popular Cows 受欢迎的牛
题目描述
每一头牛的愿望就是变成一头最受欢迎的牛。现在有N(N<=10000)头牛,给你M(M<=50000)对整数(A,B),表示牛A认为牛B受欢迎。这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头牛被所有的牛认为是受欢的。
输入格式
第一行两个数N,M。
接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可能重复)
N<=10000,M<=50000
输出格式
一个数,即有多少头牛被所有的牛认为是受欢迎的
根据题目中所说的"传递性",显然一个强连通分量里的牛是互相欢迎的。
根据这一点,我们可以先找出强连通分量,然后缩点。对于得到的DAG,我们再分析一下它的性质。
首先,如果一头牛被所有牛都欢迎,那么这头牛所在的强连通分量内的所有牛也被所有牛欢迎。并且从所有牛出发,都能够走到这个强连通分量去。所以,如果存在两个及以上出度为0的强连通分量,那么就不存在被所有牛欢迎的牛。那么如果存在被所有牛欢迎的牛,就说明缩完点的图中只有一个出度为0的点,答案为这个强连通分量的大小。
强连通分量用Tarjan找,总时间复杂度为O(N+M)。
#include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 10001
#define maxm 50001
using namespace std;
struct edge {
int to,next;
edge() {}
edge(const int &_to,const int &_next){ to=_to,next=_next; }
}e[maxm];
int head[maxn],k;
int n,m;
int dfn[maxn],low[maxn],tot;
int stack[maxn],top;
bool vis[maxn];
int col[maxn],cnt,size[maxn],du[maxn];
inline void add(const int &u,const int &v){ e[k]=edge(v,head[u]),head[u]=k++; }
void tarjan(const int &u) {
dfn[u]=low[u]=++tot;
stack[++top]=u,vis[u]=true;
for(register int i=head[u];~i;i=e[i].next){
int v=e[i].to;
if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
else if(vis[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
int v; cnt++;
do{ v=stack[top--],vis[v]=false,size[cnt]++,col[v]=cnt; }while(u!=v);
}
}
inline void print(){
for(register int i=1;i<=n;i++) {
for(register int j=head[i];~j;j=e[j].next) if(col[i]!=col[e[j].to]) du[col[i]]++;
}
register int flag=false;
for(register int i=1;i<=cnt;i++) if(!du[i]){
if(flag){ printf("0\n"); return; }
flag=i;
}
printf("%d\n",size[flag]);
}
int main() {
memset(head,-1,sizeof head);
scanf("%d%d",&n,&m);
for(register int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
}
for(register int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
print();
return 0;
}
PKU2186 Popular Cows 受欢迎的牛的更多相关文章
- 洛谷——P2341 [HAOI2006]受欢迎的牛//POJ2186:Popular Cows
P2341 [HAOI2006]受欢迎的牛/POJ2186:Popular Cows 题目背景 本题测试数据已修复. 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所 ...
- poj 2186 Popular Cows【tarjan求scc个数&&缩点】【求一个图中可以到达其余所有任意点的点的个数】
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 27698 Accepted: 11148 De ...
- POJ 2186 Popular Cows (强联通)
id=2186">http://poj.org/problem? id=2186 Popular Cows Time Limit: 2000MS Memory Limit: 655 ...
- 连通图 poj2186 最受欢迎的牛(求最受欢迎的牛的数量)
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 27531 Accepted: 11077 De ...
- POJ 2186 Popular Cows(Targin缩点)
传送门 Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 31808 Accepted: 1292 ...
- POJ2186 Popular Cows [强连通分量|缩点]
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 31241 Accepted: 12691 De ...
- [强连通分量] POJ 2186 Popular Cows
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 31815 Accepted: 12927 De ...
- poj 2186 Popular Cows (强连通分量+缩点)
http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissi ...
- POJ2186 Popular Cows 【强连通分量】+【Kosaraju】+【Tarjan】+【Garbow】
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 23445 Accepted: 9605 Des ...
随机推荐
- 【涂鸦物联网足迹】用煲仔饭来说明IaaS/PaaS/SaaS的区别
最近在准备一些科普性的知识内容,发现大家对于一些基础性的知识概念还是有点模糊.今天先来简单介绍一下IaaS/PaaS/SaaS的区别~ 其实还有一个On-Premises(本地部署)的概念,也可以一并 ...
- js上 六、运算符-2
6.1.关系运算符 用来进行比较的.比较的结果通常是布尔值真和假. ü ==:相等,只比较值是否相等 ü ===:全等,比较值的同时比较数据类型是否相等 ü !=:不相等,比较值是否不相等 ü !== ...
- [日常摸鱼]bzoj1036 [ZJOI2008]树的统计Count
听说后天会考x 省选居然还考模板题的么(好吧好像NOI也有考而且也是树剖-) 题意:一棵树,每个点有权值,三种操作:单点修改.求链上最大值.求链上权值和. 直接上模板. 我可能不会写单点修改的线段树了 ...
- Web服务器-并发服务器-协程 (3.4.2)
@ 目录 1.分析 2.代码 关于作者 1.分析 随着网站的用户量越来愈多,通过多进程多线程的会力不从心 使用协程可以缓解这一问题 只要使用gevent实现 2.代码 from socket impo ...
- [BUUCTF] MISC-九连环
0x01 知识点 伪加密 steghide提取信息 0x02 伪加密的判断 首先,在winhex分析,发现有4个zip文件的文件头和2个文件尾,有完整文件头尾那么可以直接修改后缀为zip解压, 查看一 ...
- GDB —— 优化STL容器变量的显示
步骤 wget http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt cp dbinit_stl_views-1.03.txt ...
- C4 模型 - 可视化架构设计
前言 世界上最难的两件事是: 1. 把我的思想放进你的脑袋 2. 把你的钱放进我的口袋 第二点我们不探讨,因为这是众所周知的,不信?过来试试:) 对于第一点,对我们程序员来说,其实也是我个人一直强调的 ...
- 利用xlutils第三方库复制excel模板
Python之利用第三方库套用excel模板,模板的样子假设如下: 现在要用这个模板,并且在"第二行第二列"的下方填入内容: #!usr/bin/python3 # -*-codi ...
- 教你如何修改Python的pip源镜像
PS:在pip install安装扩展库的时候,遇到安装超时失败,可能是因为国外镜像被屏蔽了. 可以使用国内开放的pip源: 阿里云 http://mirrors.aliyun.com/pypi/si ...
- Python 最简单的数字相乘
风变编程第18关,快要结束了,捎带着复习了一下前面的基础.结果悲剧了. 打开题目是这样的: 比如我们想写一个根据圆的半径(R)来求面积(S)和周长(L)的代码,可以画出以下的流程图 抬眼一看,好简单的 ...