题目描述

每一头牛的愿望就是变成一头最受欢迎的牛。现在有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 受欢迎的牛的更多相关文章

  1. 洛谷——P2341 [HAOI2006]受欢迎的牛//POJ2186:Popular Cows

    P2341 [HAOI2006]受欢迎的牛/POJ2186:Popular Cows 题目背景 本题测试数据已修复. 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所 ...

  2. poj 2186 Popular Cows【tarjan求scc个数&&缩点】【求一个图中可以到达其余所有任意点的点的个数】

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27698   Accepted: 11148 De ...

  3. POJ 2186 Popular Cows (强联通)

    id=2186">http://poj.org/problem? id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 655 ...

  4. 连通图 poj2186 最受欢迎的牛(求最受欢迎的牛的数量)

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27531   Accepted: 11077 De ...

  5. POJ 2186 Popular Cows(Targin缩点)

    传送门 Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 31808   Accepted: 1292 ...

  6. POJ2186 Popular Cows [强连通分量|缩点]

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 31241   Accepted: 12691 De ...

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

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

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

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

  9. POJ2186 Popular Cows 【强连通分量】+【Kosaraju】+【Tarjan】+【Garbow】

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 23445   Accepted: 9605 Des ...

随机推荐

  1. 2020-2021-1 20209307《Linux内核原理与分析》第五周作业

    一.理论知识 系统调用:操作系统为用户态进程与硬件设备进行交互提供的一组接口. 系统调用的三层皮:API(应用程序接口),中断向量system_call,中断服务程序sys_xyz 宏观上Linux操 ...

  2. vue第六单元(vue的实例和组件-vue实例的相关属性和方法-解释vue的原理-创建vue的组件)

    第六单元(vue的实例和组件-vue实例的相关属性和方法-解释vue的原理-创建vue的组件) #课程目标 掌握vue实例的相关属性和方法的含义和使用 了解vue的数据响应原理 熟悉创建组件,了解全局 ...

  3. js下 Day03、DOM操作--节点方法

    语法:parentNode.appendChild(child) 功能:向父节点的子节点列表的末尾添加新的子节点 语法:parentNode.removeChild(child) 功能:从子节点列表中 ...

  4. 一步步分析:C语言如何面向对象编程

    这是道哥的第009篇原创 一.前言 在嵌入式开发中,C/C++语言是使用最普及的,在C++11版本之前,它们的语法是比较相似的,只不过C++提供了面向对象的编程方式. 虽然C++语言是从C语言发展而来 ...

  5. 面试官: ShardingSphere 学一下吧

    文章目录 目录 一.ShardingSphere简介 二.Sharding-JDBC 2.1 Sharding-JDBC实现水平分表 2.2 Sharding-JDBC实现水平分库 2.3 Shard ...

  6. JDK 8 新特性,从入门到精通

    default关键字 在jdk1.8以前接口里面是只能有抽象方法,不能有任何方法的实现的. 在jdk1.8里面打破了这个规定,引入了新的关键字:default,使用default修饰方法,可以在接口里 ...

  7. Prometheus从入门到精通:一、部署

    一.Prometheus是什么? prometheus是一个开源指标监控解决方案,指标就是指的CPU的使用率.内存使用率等数据. 二.Prometheus的架构 这里直接粘贴官网的架构图: 三.安装 ...

  8. Flutter低版本迁移到高版本

    记录一次Flutter v1.12.13+hotfix.8 升级到1.22.4(当前最新) 后 ,旧项目的适配过程 工具:Android Studio 4.1.1 1.android 的MainAct ...

  9. 私有Maven仓库安装和使用

    安装 这里选择安装的是windows平台,linux安装类似,下载可能要梯子 官网下载页 https://help.sonatype.com/repomanager2/download 下载链接 ht ...

  10. web项目报错 无法解析,丢失包 是缺少本地运行jre

    1.通过build path 添加add Library 2.添加jre