BZOJ 1051 受欢迎的牛
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
1 2
2 1
2 3
Sample Output
HINT
Source
很明显,tarjan缩点+topsort,然后bitset大法好。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<bitset>
#include<queue>
#include<stack>
#include<cstdlib>
using namespace std; #define maxn 10010
#define maxm 60010
int n,m,cnt,tot,dfn[maxn],low[maxn],id[maxn],d[maxn];
int side[maxn],toit[maxm],next[maxm];
int nside[maxn],ntoit[maxm],nnext[maxm];
stack <int> S; bitset <maxn> bit[maxn]; bool vis[maxn]; inline void add(int a,int b) { next[++cnt] = side[a]; side[a] = cnt; toit[cnt] = b; } inline void ins(int a,int b)
{
nnext[++cnt] = nside[a]; ++d[b];
nside[a] = cnt; ntoit[cnt] = b;
} inline void dfs(int now)
{
S.push(now); dfn[now] = low[now] = ++cnt;
for (int i = side[now];i;i = next[i])
if (!vis[toit[i]])
{
if (!dfn[toit[i]]) dfs(toit[i]);
low[now] = min(low[toit[i]],low[now]);
}
if (dfn[now] == low[now])
{
++tot;
while (S.top() != now) vis[S.top()] = true,id[S.top()] = tot,S.pop();
vis[S.top()] = true,id[S.top()] = tot,S.pop();
}
} inline void rebuild()
{
cnt = ;
for (int i = ;i <= n;++i)
{
bit[id[i]].set(i-);
for (int j = side[i];j;j = next[j])
if (id[i] != id[toit[j]]) ins(id[i],id[toit[j]]);
}
} inline void topsort()
{
queue <int> team;
for (int i = ;i <= tot;++i) if (!d[i]) team.push(i);
while (!team.empty())
{
int now = team.front(); team.pop();
for (int i = nside[now];i;i = nnext[i])
{
bit[ntoit[i]] |= bit[now];
if (!--d[ntoit[i]]) team.push(ntoit[i]);
}
}
int ans = ;
for (int i = ;i <= n;++i) if (bit[id[i]].count() == n) ++ans;
printf("%d",ans);
} int main()
{
freopen("1051.in","r",stdin);
freopen("1051.out","w",stdout);
scanf("%d %d",&n,&m);
for (int i = ;i <= n;++i) add(i,i);
while (m--) { int a,b; scanf("%d %d",&a,&b); add(a,b); }
cnt = ;
for (int i = ;i <= n;++i) if (!dfn[i]) dfs(i);
rebuild();
topsort();
fclose(stdin); fclose(stdout);
return ;
}
BZOJ 1051 受欢迎的牛的更多相关文章
- BZOJ 1051 受欢迎的牛(Tarjan缩点)
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4573 Solved: 2428 [Submit][S ...
- 【tarjan】BZOJ 1051:受欢迎的牛
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3134 Solved: 1642[Submit][Sta ...
- BZOJ 1051 受欢迎的牛 缩点
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1051 题目大意: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数( ...
- bzoj 1051 受欢迎的牛-tarjan
https://www.lydsy.com/JudgeOnline/problem.php?id=1051 如果A喜欢B,那么A->B连边,那么整个图储存下来,如果有好多个牛是受欢迎的,那么他们 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 【BZOJ】1051: [HAOI2006]受欢迎的牛(tarjan)
http://www.lydsy.com/JudgeOnline/problem.php?id=1051 这题还好-1A了..但是前提还是看了题解的 囧.....一开始认为是并查集,oh,不行,,无法 ...
- BZOJ 1051: [HAOI2006]受欢迎的牛 缩点
1051: [HAOI2006]受欢迎的牛 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
- 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, 否则无解 ----------------------------------------------------------- ...
随机推荐
- Qt 发送 https 请求
1.环境 ubuntu 12.04 Qt库版本 4.8.1(安装包是Nokia时期的sdk,现在已经不好找了) 2.网上一查都说 Qt 默认不支持Openssl,心想那https也肯定用不了啊,然后屁 ...
- WCF - 契约
契约就是双方或多方就某个问题达成的一种的共识 服务提供者通过契约的形式将服务公布出来 服务消费者根据契约来消费 这样通过契约这个中间者就可以规范服务提供的内容 而服务消费者也可以根据契约来使用服务端 ...
- cygwin下用mysql c api连接数据库详解
一.典型错误: 错误1: 命令: gcc -I /usr/include/mysql/ -L /lib/ -lmysqlclient main.c 错误: /tmp/ccT0KqUQ.o:main.c ...
- requireJS入门
RequireJS 下载地址 : http://requirejs.org 什么是 requireJS ?以下是官方网站上的解释: RequireJS is a JavaScript file and ...
- linux-3.0下input_dev模型按键驱动
该代码在FL2440开发板上测试通过,为方便教学,将驱动中的platform_device和platform_driver故意分为两个驱动模块. [guowenxue@centos6 input_kb ...
- js 高阶函数 filter
filter用于过滤array中的一些值,通过带入的函数返回的ture 或false 保留或去除,返回一个新的array filter 使用演示:判断筛选出array中的素数: //判断素数自定义函数 ...
- Java异常之try,catch,finally,throw,throws
Java异常之try,catch,finally,throw,throws 你能区分异常和错误吗? 我们每天上班,正常情况下可能30分钟就能到达.但是由于车多,人多,道路拥挤,致使我们要花费更多地时间 ...
- 关于git status
如果只在本地修改,还没有commit,那么用git status, 打印信息为: 如果我本地没有修改文件,就是:
- PHP 中xampp不能启动服务器的问题
有时候别人电脑上面的XAMPP,你把安装文件拷贝下来后,会发现,自己的电脑上用不了 这个时候有很多种情况 1. 关闭你自己电脑上有可能暂用80端口的程序 2.D:\xampp\apache\conf\ ...
- String、StringBuffer、StringBuilder
也说String. String:不可变字符序列. StringBuffer:线程安全的可变字符序列. StringBuilder:StringBuffer的非线程安全实现,JDK1.5+. publ ...