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

最新文章

  1. &lt;&lt;&lt; 入侵网站类提权注入教程
  2. python读取配置文件
  3. Linux UserSpace Back-Door、Rootkit SSH/PAM Backdoor Attack And Defensive Tchnology
  4. Typecho中的gravatar头像无法加载
  5. Mysql 删除语句
  6. CentOS出错You don&#39;t have permission to access on this server
  7. [CoreOS 转载] CoreOS实践指南(五):分布式数据存储Etcd(上)
  8. HTML对JSON的操作
  9. SQL Server--导入和导出向导
  10. The first day,I get a blogs!!
  11. CSS中可以继承和不可继承的常见属性
  12. js对时间的一些操作
  13. Android studio 远程服务调用
  14. 使用shell命令给文件中每一行的前面、后面添加字符
  15. FastAdmin 基本知识流程一栏
  16. yii2快速導出phpexcel
  17. SSL/TLS Server supports TLSv1.0
  18. 超详细的PS抠图方法
  19. redis安装及常用命令
  20. Python 爬虫 数据清洗 去掉 超链接

热门文章

  1. python运行过程
  2. DHCP Option43配置
  3. 原生js中用Ajax进行get传参
  4. ARM 编译产生.map之RO RW ZI
  5. 涂抹mysql笔记-管理mysql库和表
  6. Core Graphices 获取上下文
  7. Vue 路由及路由默认跳转
  8. MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比
  9. 性能测试day04_性能监控
  10. 学习excel的使用技巧四显示正常的数字