P2341 [HAOI2006]受欢迎的牛

题目描述

每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶

牛都是自恋狂,每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果A喜

欢B,B喜欢C,那么A也喜欢C。牛栏里共有N 头奶牛,给定一些奶牛之间的爱慕关系,请你

算出有多少头奶牛可以当明星。

输入输出格式

输入格式:

 第一行:两个用空格分开的整数:N和M

 第二行到第M + 1行:每行两个用空格分开的整数:A和B,表示A喜欢B

输出格式:

 第一行:单独一个整数,表示明星奶牛的数量

输入输出样例

输入样例#1:

3 3
1 2
2 1
2 3
输出样例#1:

1

说明

只有 3 号奶牛可以做明星

【数据范围】

10%的数据N<=20, M<=50

30%的数据N<=1000,M<=20000

70%的数据N<=5000,M<=50000

100%的数据N<=10000,M<=50000

分析 : 

只有所有奶牛都喜欢的奶牛才可能成为明星,也就是所有的点都能到达的点。

首先可以求强联通分量,然后统计所有强联通分量的出度,如果为0的只有一个,输出这个强联通分量的大小即可,否则输出0

为什么?因为我们所要求得点是所有点都能达到(被所有牛认同的牛),所以可以先tarjan缩点(求的点有多个),缩点之后,点内所有的点是可以相互支持的,可以不用管他们,看做一个点即可。

然后为什么找出度为0的且只能找一个呢?

  • 首先他必出度为0,如果他有出度,设他支持a,这已经是有个大点(缩点)了,大点内所有的点都可以相互支持,然后大点又支持a(a不在大点内),且a一定不支持这个大点(如果a支持大点,a在这个大点(被缩点)内),所以一定要找没有出度的点;
  • 只能找一个,如果有两个或以上,那么就一个明星也没有,我们假设两个点x,y没有出度,既然x,y都没有出度,x点就不支持y,y也不支持x,所以就没有没有明星,(一个出度为零的点无法到达另一个出度为零的点,都没有出度了,哪来的“到达”呢?)

code

 #include<cstdio>
#include<algorithm>
#include<stack>
using namespace std; const int MAXN = ;
struct Edge{
int to,nxt;
}e[];
int head[MAXN],dfn[MAXN],low[MAXN],bel[MAXN],sz[MAXN],pd[MAXN],x[],y[];
bool vis[MAXN];
int cnt,n,m,tot,num,ans,flag;
stack<int>s; void add(int u,int v)
{
++cnt;
e[cnt].to = v;
e[cnt].nxt = head[u];
head[u] = cnt;
}
void tarjan(int u)
{
low[u] = dfn[u] = ++tot;
s.push(u);
vis[u] = true ;
for (int i=head[u]; i; i=e[i].nxt)
{
int v = e[i].to;
if (!dfn[v])
{
tarjan(v);
low[u] = min(low[u],low[v]);
}
else if (vis[v]) low[u] = min(low[u],dfn[v]);
}
if (dfn[u]==low[u])
{
int now = -;
num++;
while (now!=u)
{
now = s.top();
s.pop();
bel[now] = num;
sz[num]++;
vis[now] = false ;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=; i<=m; ++i)
{
scanf("%d%d",&x[i],&y[i]);
add(x[i],y[i]);
}
for (int i=; i<=n; ++i)
if (!dfn[i]) tarjan(i); for (int i=; i<=m; ++i)
if (bel[x[i]]!=bel[y[i]])
pd[bel[x[i]]]++; for (int i=; i<=num; ++i)
if (!pd[i])
flag++, ans = sz[i]; if (flag==) printf("%d",ans);
else printf("");
return ;
}

最新文章

  1. Android Fragment 剖析
  2. 2.0 (1)安装MongoDB
  3. 回顾yii的学习进程 总结了一下的发展过程
  4. 【荐】说说CSS Hack 和向后兼容
  5. EF Code-First数据迁移的尝试
  6. string evaluated instead to freemarker.template.SimpleScalar
  7. SimpleHttpServer的学习之UML
  8. Ubuntu 12.04 安装搜狗输入法
  9. jQuery tmpl index
  10. java 采用MD5加密解密
  11. Rar related CMD
  12. nyoj61 传纸条(一) dp
  13. iOS - Quartz 2D 贝塞尔曲线
  14. vue-cli title 里面怎动态显示文字
  15. 如何简单的在 ASP.NET Core 中集成 JWT 认证?
  16. python 入门基础21 --面向对象_多态、内置方法、反射
  17. IIS 反向代理设置
  18. virt-install vs qemu-kvm创建guest主机
  19. nodejs学习笔记&lt;二&gt; 使用node创建基础服务器
  20. unity3d API知识点随记

热门文章

  1. Mybatis:Reader entry: ���� 4
  2. 初看Mybatis 源码 (一)
  3. 转发-react 性能深度探讨
  4. avast从隔离区恢复后,仍无法打开被误杀文件的解决方案
  5. April 20 2017 Week 16 Thursday
  6. POJ - 1201 Intervals (最短路解线性规划)
  7. [论文理解]关于ResNet的进一步理解
  8. 2017.11.17 C++系列---用malloc动态给c++二维数组的申请与释放操作
  9. js将数字转换成中文
  10. override与重载的区别