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

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 ;
}

最新文章

  1. 远程连接mysql 1130错误解决方法
  2. poj3069 Saruman&#39;s Army
  3. IntelliJ IDEA常用快捷键windows
  4. python基础整理笔记(八)
  5. Android工程师入门(二)——不忙不累怎么睡。。
  6. iOS - UITextfield 验证邮箱格式
  7. Maven构建Hadoop Maven构建Hadoop工程
  8. android项目 在签名打包遇到的问题
  9. python day1 常用模块
  10. cadence学习之原理图——连线
  11. Odoo 外协加工产品的实现
  12. ActiveMQ(5.10.0) - Destination-level authorization
  13. ajax:html5上传文件,上传之前可以实现本地预览
  14. cf C. Sereja and Algorithm
  15. OC基础7:变量和数据类型
  16. 01-复杂度2. Maximum Subsequence Sum (25)
  17. Java对象序列化与反序列化一 JSON
  18. jQuery事件触发和参数传递
  19. 201521123069 《Java程序设计》 第10周学习总结
  20. noj算法 素数环 回溯法

热门文章

  1. 你的Jsp页面有黄&#215;么,有黄色问号么?Multiple annotations found at this line: - Invalid location of tag (form). - No
  2. POJ 1737 统计有n个顶点的连通图有多少个 (带标号)
  3. [RxJS] Error handling operator: catch
  4. [AngularJS + Webpack] Requiring CSS &amp; Preprocessors
  5. JSON 入门
  6. Qt 学习之路:模型-视图高级技术
  7. iOS 自动布局总结
  8. xslt语法之---position()函数
  9. UVA - 11572 Unique Snowflakes
  10. 17、SQL Server 备份和还原