【tarjan+缩点】BZOJ1051-受欢迎的牛
【题意】
每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头牛被所有的牛认为是受欢迎的。
【思路】
存在于首页的经典老题,之前POJ的那道题做过之后无压力1A水过。
先用tarjan将所有联通分量进行缩点,缩点后考虑出度为0的点的个数:
(1)个数大于1的时候,显然不存在受欢迎的牛!
(2)个数等于0的时候,假设有一头牛X是受欢迎的,那么它必定有喜欢的牛Y,而它又收到牛Y的欢迎,说明存在环,不是DAG图,矛盾!
(3)个数等于1的时候,用数学归纳法推一下,有这样一个结论:出度为0的那个点可以被其它所有点到达。
有了这样的结论,直接做就可以了XD
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<stack>
#include<cmath>
#include<algorithm>
const int MAXN=+;
const int MAXM=+;
using namespace std;
int vis[MAXN],instack[MAXN];
int u[MAXM],v[MAXM];
int b[MAXN],sum[MAXN];
int dfn[MAXN],low[MAXN];
vector<int> E[MAXN];
stack<int> S;
int n,m;
int cnt=-,T=; void tarjan(int u)
{
dfn[u]=low[u]=++T;
vis[u]=;
S.push(u);
instack[u]=; for (int i=;i<E[u].size();i++)
{
int son=E[u][i];
if (!vis[son])
{
tarjan(son);
low[u]=min(low[son],low[u]);
}
else
if (vis[son] && instack[son])
low[u]=min(dfn[son],low[u]);
} if (dfn[u]==low[u])
{
cnt++;
int x;
do
{
x=S.top();
S.pop();
sum[cnt]++;
b[x]=cnt;
instack[x]=;
}while (x!=u);
}
} void init()
{
memset(vis,,sizeof(vis));
memset(sum,,sizeof(sum));
memset(instack,,sizeof(instack));
scanf("%d%d",&n,&m);
for (int i=;i<m;i++)
{
scanf("%d%d",&u[i],&v[i]);
E[u[i]].push_back(v[i]);
}
} void solve()
{
int out[MAXN];
memset(out,,sizeof(out));
for (int i=;i<m;i++)
if (b[u[i]]!=b[v[i]])
{
out[b[u[i]]]++;
} int noout=;
int res;
for (int i=;i<=cnt;i++)
if (out[i]==)
{
res=i;
noout++;
}
if (noout==) cout<<sum[res]<<endl;
else cout<<<<endl;
} int main()
{
init();
for (int i=;i<=n;i++) if (vis[i]==) tarjan(i);
solve();
return ;
}
【tarjan+缩点】BZOJ1051-受欢迎的牛的更多相关文章
- BZOJ1051:受欢迎的牛(并查集 / Tarjan)
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 8161 Solved: 4460 Description ...
- bzoj1051受欢迎的牛(Tarjan)
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4776 Solved: 2542 Description ...
- 缩点Tarjan算法解析+[题解]受欢迎的牛
(注:我在网上找了一些图,希望原博主不要在意,谢谢,(。☉౪ ⊙。)) 首先来了解什么是强连通分量 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向 ...
- 【tarjan】BZOJ 1051:受欢迎的牛
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3134 Solved: 1642[Submit][Sta ...
- p2341&bzoj1051 受欢迎的牛
传送门(洛谷) 传送门(bzoj) 题目 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C ...
- BZOJ1051 受欢迎的牛
http://www.lydsy.com/JudgeOnline/problem.php?id=1051 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A ...
- [HAOI2006]受欢迎的牛 tarjan缩点 BZOJ1051
题目背景 本题测试数据已修复. 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的——如果A喜 ...
- Tarjan算法模板(USACO03FALL受欢迎的牛)
好文章 #include<bits/stdc++.h> using namespace std; const int N = 10010, M = 50010; int n, m; int ...
- 【BZOJ1051】1051: [HAOI2006]受欢迎的牛 tarjan求强连通分量+缩点
Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认 ...
随机推荐
- 【转】MP3文件原理及结构解析
1.引言文件压缩技术的日新月异使得MP3成为时下最烫手的音乐格式,优质的音乐随着0与1的排列迅速散布 到世界各地,撼动人心.何谓MP3?MP3的全称是MPEG Audio Layer 3,它是一种高效 ...
- python之requests库使用问题汇总
一.请求参数类型 1.get requests.get(url, data, cookies=cookies) url:字符串: data:字典类型,可以为空: cookies:字典类型,可以为空: ...
- pypcap 安装
1.下载winpcap开发包 https://www.winpcap.org/devel.htm 下载https://github.com/pynetwork/pypcap/releases最新发布的 ...
- PostGIS pgrouting路径分析
--让数据库支持PostGIS和pgRouting的函数和基础表(安装后第一次使用时执行,以后都不再执行) CREATE EXTENSION postgis; CREATE EXTENSION pgr ...
- PHP设计模式二-------单例模式
1.单例模式的介绍 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点: 主要解决:一个全局使用的类频繁地创建与销毁. 关键代码:构造函数是私有的,克隆方法也是私有的. 1.1 懒汉式//1 ...
- python_day6学习笔记
一.Logger模块 logging.basicConfig函数 可通过具体参数来更改logging模块默认行为,可用参数有 filename: 用指定的文件名创建FiledHandler(后边会具体 ...
- new、operator new、placement new
首先我们区分下几个容易混淆的关键词: new.operator new.placement new new和delete操作符我们应该都用过,它们是对堆中的内存进行申请和释放,而这两个都是不能被重载的 ...
- 何時需要重启 OFBiz
你在做如下更改時需要重新启動OFBiz服務器: - Java文件(記得要重新編譯) - 配置/.properties文件 - entitymodel或entitygroup XML定義文件 - 服務或 ...
- git------删除Repository
需求:删除仓库 Lucky-Repository,实现步骤如下截图所示 如上完成删除操作
- Python实例 | 贴吧签到
第一步 查看HTTP请求的内容 首先需要通过浏览器或者其他http包分析软件来观察,签到的时候进行了什么请求. Firefox浏览器就足以做到这一点,Wireshark是更加专业的包分析软件,它除了能 ...