BZOJ 1051 受欢迎的牛
2024-10-18 15:48:44
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
1 2
2 1
2 3
Sample Output
1
HINT
100%的数据N<=10000,M<=50000
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 ;
}
最新文章
- 远程连接mysql 1130错误解决方法
- poj3069 Saruman&#39;s Army
- IntelliJ IDEA常用快捷键windows
- python基础整理笔记(八)
- Android工程师入门(二)——不忙不累怎么睡。。
- iOS - UITextfield 验证邮箱格式
- Maven构建Hadoop Maven构建Hadoop工程
- android项目 在签名打包遇到的问题
- python day1 常用模块
- cadence学习之原理图——连线
- Odoo 外协加工产品的实现
- ActiveMQ(5.10.0) - Destination-level authorization
- ajax:html5上传文件,上传之前可以实现本地预览
- cf C. Sereja and Algorithm
- OC基础7:变量和数据类型
- 01-复杂度2. Maximum Subsequence Sum (25)
- Java对象序列化与反序列化一 JSON
- jQuery事件触发和参数传递
- 201521123069 《Java程序设计》 第10周学习总结
- noj算法 素数环 回溯法
热门文章
- 你的Jsp页面有黄&#215;么,有黄色问号么?Multiple annotations found at this line: - Invalid location of tag (form). - No
- POJ 1737 统计有n个顶点的连通图有多少个 (带标号)
- [RxJS] Error handling operator: catch
- [AngularJS + Webpack] Requiring CSS &; Preprocessors
- JSON 入门
- Qt 学习之路:模型-视图高级技术
- iOS 自动布局总结
- xslt语法之---position()函数
- UVA - 11572 Unique Snowflakes
- 17、SQL Server 备份和还原