受欢迎的牛[HAOI2006]
——BZOJ1051
Description
每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这
种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头牛被所有的牛认为是受欢迎的。
Input
第一行两个数N,M。 接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可能重复,即有可能出现多个A,B)
Output
一个数,即有多少头牛被所有的牛认为是受欢迎的。
Sample Input
3 3
1 2
2 1
2 3
Sample Output
1
HINT
$ 100% $ 的数据 $ N<=10000 $ ,$ M<=50000 $
Analysis
我们需要考虑哪些牛受欢迎,就是考虑哪些点能被所有点访问过。
这道题我的思维过程是这样的:试想一下出度为0的点。如果整张图只有一个出度为0的点,那么它肯定是受欢迎的。(有两个就不是了,不能互相到达)
那要是没有出度为0的点呢,那就是有环呗,环之间的点都能互相到达,那只要环外的点都能到达环,那环内的点都受欢迎。一个环就是强连通分量,那强连通分量里的点都能互相到达。那我们就想到了刚才说的结论,联想到把强联通分量想象成一个点,这个点可是出度为0的,若是只有一个这样的“点”的话,就有很多受欢迎的牛了。
这就是强联通分量缩点的算法。强联通分量用tarjan来求,缩点重构图操作一下,答案就求出来了。
code
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 100005;
bool vis[maxn];
int runn[maxn];
vector <int> edge[maxn];
vector <int> fedge[maxn];
int m,n;
int ans;
int tot;
int dfn[maxn],st[maxn],low[maxn],ins[maxn],bel[maxn],top,cnt,scc,buc[maxn],visb[maxn];
void tarjan(int x)
{
dfn[x] = low[x] = ++cnt;
st[++top] = x;
ins[x] = 1;
for(int i=0;i<edge[x].size();i++)
{
if(!dfn[edge[x][i]])
{
tarjan(edge[x][i]);
low[x] = min(low[x],low[edge[x][i]]);
}
else if(ins[edge[x][i]])
low[x] = min(low[x],dfn[edge[x][i]]);
}
if(dfn[x] == low[x])
{
int t;
ins[x] = 0;
bel[x] = ++scc;
while(st[top] != x)
{
t = st[top--];
ins[t] = 0;
bel[t] = scc;
}
top--;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
edge[x].push_back(y);
}
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i);
for(int i=1;i<=n;i++)
buc[bel[i]]++;
for(int i=1;i<=n;i++)
{
for(int j=0;j<edge[i].size();j++)
{
if(bel[i] != bel[edge[i][j]])
fedge[bel[i]].push_back(bel[edge[i][j]]);
}
}
for(int i=1;i<=scc;i++)
if(!fedge[i].size())
ans += buc[i];
printf("%d",ans);
return 0;
}
受欢迎的牛[HAOI2006]的更多相关文章
- 受欢迎的牛 [HAOI2006] [强连通] [传递闭包(划)]
Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛 A 认为牛 B受欢迎.这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A ...
- bzoj1051 [HAOI2006]受欢迎的牛
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4773 Solved: 2541[Submit][Sta ...
- 【bzoj1051】 [HAOI2006]受欢迎的牛 tarjan缩点判出度算点数
[bzoj1051] [HAOI2006]受欢迎的牛 2014年1月8日7450 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B ...
- 1051: [HAOI2006]受欢迎的牛
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2276 Solved: 1190[Submit][Sta ...
- BZOJ 1051: [HAOI2006]受欢迎的牛 缩点
1051: [HAOI2006]受欢迎的牛 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
- 【BZOJ】1051: [HAOI2006]受欢迎的牛
[HAOI2006]受欢迎的牛 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢 ...
- bzoj 1051: [HAOI2006]受欢迎的牛 tarjan缩点
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2092 Solved: 1096[Submit][Sta ...
- BZOJ 1051: [HAOI2006]受欢迎的牛( tarjan )
tarjan缩点后, 有且仅有一个出度为0的强连通分量即answer, 否则无解 ----------------------------------------------------------- ...
- bzoj1051: [HAOI2006]受欢迎的牛(tarjan板子)
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6064 Solved: 3179[Submit][Sta ...
随机推荐
- 自己动手开发智能聊天机器人完全指南(附python完整源码)
一.前言 人工智能时代,开发一款自己的智能问答机器人,一方面提升自己的AI能力,另一方面作为转型AI的实战练习.在此把学习过程记录下来,算是自己的笔记. 二.正文 2.1 下载pyaiml 下载pya ...
- Hexo-Next6.7.0主题优化
Hexo-Next6.7.0主题优化 效果预览:Next6.7.0主题个人博客 一.下载next主题 $ cd your-hexo-site $ git clone https://github.co ...
- C/C++中的volatile简单描述
首先引入一篇博客: 1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier.这是 BS 在 ...
- Scrapy学习篇(十一)之设置随机User-Agent
大多数情况下,网站都会根据我们的请求头信息来区分你是不是一个爬虫程序,如果一旦识别出这是一个爬虫程序,很容易就会拒绝我们的请求,因此我们需要给我们的爬虫手动添加请求头信息,来模拟浏览器的行为,但是当我 ...
- python:带参数的装饰器,函数的有用信息
一.带参数的装饰器,函数的有用信息 def func1(): '''此函数的功能是完成的登陆的功能 return: 返回值是登陆成功与否(true,false) ''' print(333) func ...
- 刘志梅201771010115.《面向对象程序设计(java)》第六周学习总结
实验六 继承定义与使用 实验时间 2018-9-28 1.实验目的与要求 (1) 继承的定义:用已有类来构建新类的一种机制.当定义了一个新类继承了一个类时,这个新类就继承了这个类的方法和域,同时在新类 ...
- Web缓存机制
Web 缓存的出现主要是为了弥补cookie带来的一些局限,当数据严格控制在客户端时,可以不用通过HTTP来持续得将数据发给服务器. 主要使用比较多的就是sessionStorage和localSto ...
- mysql timestamp字段定义的
Cause: java.sql.SQLException: Cannot convert value '2017-07-26 20:40:41.000000' from column 10 to TI ...
- leetcode128
class Solution: def longestConsecutive(self, nums: 'List[int]') -> int: if len(nums)<=1: retur ...
- Delphi中Chrome Chromium、Cef3学习笔记(二)
原文 http://blog.csdn.net/xtfnpgy/article/details/46635739 用Tchromium替换webbrowser 用惯了EmbeddedWB,不想 ...