洛谷P1341 最受欢迎的奶牛
题目描述
每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶
牛都是自恋狂,每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果A喜
欢B,B喜欢C,那么A也喜欢C。牛栏里共有N 头奶牛,给定一些奶牛之间的爱慕关系,请你
算出有多少头奶牛可以当明星。
输入输出格式
输入格式:
第一行:两个用空格分开的整数:N和M
第二行到第M + 1行:每行两个用空格分开的整数:A和B,表示A喜欢B
输出格式:
第一行:单独一个整数,表示明星奶牛的数量
输入输出样例
3 3
1 2
2 1
2 3
1
说明
只有 3 号奶牛可以做明星
【数据范围】
10%的数据N<=20, M<=50
30%的数据N<=1000,M<=20000
70%的数据N<=5000,M<=50000
100%的数据N<=10000,M<=50000
这道题考察的是Tarjan,Tarjan是什么,大家可以看这篇博客http://www.cnblogs.com/jason2003/p/8417629.html
首先,显而易见的是,只要一个强连通分量中一个奶牛是明星奶牛,那么这个强连通分量里面所有的奶牛都是明星奶牛,根据这个定理,我们可以忽视每一个奶牛,而是把这些奶牛的每一个连通分量建成一个点,然后所有的连通分量之间如果有边就将这两个连通分量连起来,我们可以得到下图
这样看来,最后的巫妖王阿尔萨斯就是明星奶牛的连通分量
其中,因为已经跑过Tarjan,所以剩下的点不存在连通分量,一般的点都有出边,但是最后的阿尔萨斯没有出边,所以这个点就是答案,这个点里面所有的点都是答案,但是,如果有两个点没有出边,就会比较悲惨:
麦迪文就会和阿尔萨斯打起来,这种情况就没有答案连通分量,也就是没有明星奶牛了,直接输出0.
附上代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <stack>
using namespace std;
stack <int> S;
int total=;
int stamp=;
int num=;
int n,m;
int ans;
int flag=;
int dfn[],low[];
int head[],to[],next[];
int book[];
int point[];
int vis[];
int size[];
void adl(int a,int b)
{
total++;
to[total]=b;
next[total]=head[a];
head[a]=total;
return ;
}
void tarjan(int u)
{
stamp++;
dfn[u]=low[u]=stamp;
S.push(u);
vis[u]=;
for(int e=head[u];e;e=next[e])
{
if(!dfn[to[e]])
{
tarjan(to[e]);
low[u]=min(low[u],low[to[e]]);
}
else if(vis[to[e]])
low[u]=min(low[u],low[to[e]]);
}
if(low[u]==dfn[u])
{
num++;
int sum=;
while(!S.empty() && S.top()!=u)
{
sum++;
vis[S.top()]=;
point[S.top()]=num;
S.pop();
}
size[num]=sum;
vis[S.top()]=;
point[S.top()]=num;
S.pop();
}
}
int main()
{
cin>>n>>m;
for(int i=;i<=m;i++)
{
int a,b;
cin>>a>>b;
adl(a,b);
}
for(int i=;i<=n;i++)
if(!dfn[i])
tarjan(i);
for(int i=;i<=n;i++)
for(int e=head[i];e;e=next[e])
if(point[i]!=point[to[e]])
{
book[point[i]]=;
}
for(int i=;i<=num;i++)
if(book[i]==)
{
flag++;
ans=size[i];
}
if(flag>)
cout<<<<endl;
else
cout<<ans;
}
洛谷P1341 最受欢迎的奶牛的更多相关文章
- 洛谷 P2341 【受欢迎的牛】
题库:洛谷 题号:2341 题目:受欢迎的牛 link:https://www.luogu.org/problemnew/show/P2341 思路:因为奶牛的爱慕关系具有传递性,所以每个环(强连通分 ...
- BZOJ1051或洛谷2341 [HAOI2006]受欢迎的牛
BZOJ原题链接 洛谷原题链接 显然在一个强连通分量里的奶牛都可以相互喜欢,所以可以用\(tarjan\)求强连通并缩点. 要求明星奶牛必须被所有人喜欢,显然缩点后的图必须满足只有一个点没有出度,因为 ...
- 【题解】洛谷P2341 [HAOI2006]受欢迎的牛(强连通分量)
洛谷P2341:https://www.luogu.org/problemnew/show/P2341 前言 这题看错题目 足足花了将近5小时提交了15次 在一位dalao的提醒下才AC了 记得要看清 ...
- 洛谷 P2341 [HAOI2006]受欢迎的牛 解题报告
P2341 [HAOI2006]受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的"喜欢&q ...
- 洛谷——P2341 [HAOI2006]受欢迎的牛//POJ2186:Popular Cows
P2341 [HAOI2006]受欢迎的牛/POJ2186:Popular Cows 题目背景 本题测试数据已修复. 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所 ...
- 洛谷P2341 [HAOI2006]受欢迎的牛 (Tarjan,SCC缩点)
P2341 [HAOI2006]受欢迎的牛|[模板]强连通分量 https://www.luogu.org/problem/P2341 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就 ...
- 【模板】Tarjan缩点,强连通分量 洛谷P2341 [HAOI2006]受欢迎的牛 [2017年6月计划 强连通分量01]
P2341 [HAOI2006]受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的 ...
- 洛谷 P1341 无序字母对 解题报告
P1341 无序字母对 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 ...
- 洛谷P3052 [USACO12MAR]摩天大楼里的奶牛 [迭代加深搜索]
题目传送门 摩天大楼里的奶牛 题目描述 A little known fact about Bessie and friends is that they love stair climbing ra ...
随机推荐
- django框架<二>
django框架: Models 1.基本创建 Django提供了一个抽象层("Model")的构建和管理Web应用程序的数据. Django使用一种新的方式,即:关系对象映射 ...
- selenium只打开一个浏览器窗口
from selenium.webdriver import Remote from selenium.webdriver.chrome import options from selenium.co ...
- 【转载】在GitHub上管理项目
在GitHub上管理项目 新建repository 本地目录下,在命令行里新建一个代码仓库(repository) 里面只有一个README.md 命令如下: touch README.md git ...
- Windows上安装Jekyll
Jekyll是什么 jekyll是一个简单的免费的Blog生成工具,是一个静态站点生成器, 它会根据网页源码生成静态文件.它提供了模板.变量.插件等功能,所以实际上可以用来编写整个网站.也可使用基于j ...
- 最小的Django应用
创建一个hello.py 内容如下: import sys from django.conf import settings # 设置 settings.configure( DEBUG = Tr ...
- HTTPS握手过程
HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密.具体是如何进行加密,解密,验证的,且看下图,下面的称为一次握手. 1. 客户端发起HT ...
- 转:在CentOS 7.3使用yum安装 MySql5.6.24
按照CentOS 6.5的方法在CentOS 7上安装会失败,需要按照下文进行安装. 1.安装rpm包 Linux系统自带的repo是不会自动更新每个软件的最新版本(基本都是比较靠后的稳定版),所以无 ...
- Linux打补丁的一个简单例子
前言 在做开发的过程中难免需要给内核及下载的一些源码打补丁或者说是升级,所以我们学习在Linux下使用diff制作补丁以及如何使用patch打补丁显得尤为重要. diff与patch命令介绍 ...
- Codeforces 822C Hacker, pack your bags!(思维)
题目大意:给你n个旅券,上面有开始时间l,结束时间r,和花费cost,要求选择两张时间不相交的旅券时间长度相加为x,且要求花费最少. 解题思路:看了大佬的才会写!其实和之前Codeforces 776 ...
- oracle去掉字段值中的某些字符串
我想去掉字段值中的“_” select replace(fdisplayname,'_','') from SHENZHENJM1222.B replace 第一个参数:字段/值,第二个参数时替换字符 ...