今天的第二道tarjan:受欢迎的牛
原题来自:USACO 2003 Fall
题目描述
每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶牛都是自恋狂,每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果 AAA 喜欢 BBB,BBB 喜欢 CCC,那么 AAA 也喜欢 CCC。牛栏里共有 NNN 头奶牛,给定一些奶牛之间的爱慕关系,请你算出有多少头奶牛可以当明星。
输入格式
第一行:两个用空格分开的整数:NNN 和 MMM。
接下来 MMM 行:每行两个用空格分开的整数:AAA 和 BBB,表示 AAA 喜欢 BBB。
输出格式
一行单独一个整数,表示明星奶牛的数量。
输入输出样例
3 3
1 2
2 1
2 3
1
说明/提示
只有 3 号奶牛可以做明星。
数据范围

题解
emmmm
这是一到极为经典的,似乎是这一类题的模板的题目:缩点
缩点,也是tarjan的极大的一个作用。
缩点只对强联通分量有用,因为强联通分量中的点可以互相到达,可以被视为一个点。
这题,是肯定是有环的。
那么肯定是很不好去实现遍历的。
怎么办呢?
根据常识,环上的点肯定都在同一个强联通分量中。
强联通分量 -->缩点
经过缩点的图,一定是一个有向无环图
那么只需要一个dfs就好了啊awa
简单题
awa
淦,题解写完了,代码还没写。。。
等等我写完代码awa
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct edge
{
int next,to;
}e[1000001];
int head[1000001],n,m,w[1000001],tot,ccs,dfsc,low[1000001],dfn[1000001],color[10000001],cnt[1000001],de[1000001],all[1000001];bool vis[1000001];
stack<int> stk;
inline ll read()
{
char c=getchar();ll a=0,b=1;
for(;c<'0'||c>'9';c=getchar())if(c=='-')b=-1;
for(;c>='0'&&c<='9';c=getchar())a=a*10+c-48;
return a*b;
}
void add(int i,int j)
{
e[++tot].next=head[i];
e[tot].to=j;
head[i]=tot;
}
void tarjan(int x,int fa)
{
dfn[x]=low[x]=++dfsc;
vis[x]=true;stk.push(x);
for(int i=head[x];i!=0;i=e[i].next)
{
int u=e[i].to;
// if(u==fa)continue;
if(dfn[u]==0)
{
tarjan(u,x);
low[x]=min(low[x],low[u]);
}
else
if(vis[u]==true)
{
low[x]=min(low[x],dfn[u]);
}
}
if(dfn[x]==low[x])
{
int k;
ccs++;
do
{
k=stk.top();
stk.pop();
color[k]=ccs;
cnt[ccs]++;all[ccs]++;
vis[k]=false;
}
while(x!=k);
}
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
n=read();m=read();
for(int i=1;i<=m;i++)
{
int x=read();int y=read();
add(x,y);
}
for(int i=1;i<=n;i++)
{
if(dfn[i]==0)
{
tarjan(i,-1);
}
}
// for(int i=1;i<=n;i++)
// {
// cout<<color[i]<<endl;
// }
for(int i=1;i<=n;i++)
{
int x=i;
for(int j=head[x];j!=0;j=e[j].next)
{
int u=e[j].to;
if(color[u]!=color[x])
{
de[color[i]]++;
}
}
}
int ans=0,sum=0;bool tt=0;
for(int i=1;i<=ccs;i++)
{
if(de[i]==0)
{
ans+=cnt[color[i]];
sum++;
if(tt){puts("0");return 0;}
tt=i;
}
}
cout<<all[tt]<<endl;
return 0;
}
n年前的草稿总算是发布了awa
今天的第二道tarjan:受欢迎的牛的更多相关文章
- 【BZOJ1051】1051: [HAOI2006]受欢迎的牛 tarjan求强连通分量+缩点
Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认 ...
- 【bzoj1051】 [HAOI2006]受欢迎的牛 tarjan缩点判出度算点数
[bzoj1051] [HAOI2006]受欢迎的牛 2014年1月8日7450 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B ...
- 【BZOJ】1051: [HAOI2006]受欢迎的牛(tarjan)
http://www.lydsy.com/JudgeOnline/problem.php?id=1051 这题还好-1A了..但是前提还是看了题解的 囧.....一开始认为是并查集,oh,不行,,无法 ...
- BZOJ 1051 受欢迎的牛(Tarjan缩点)
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4573 Solved: 2428 [Submit][S ...
- 【tarjan】BZOJ 1051:受欢迎的牛
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3134 Solved: 1642[Submit][Sta ...
- bzoj 1051: [HAOI2006]受欢迎的牛 tarjan缩点
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2092 Solved: 1096[Submit][Sta ...
- BZOJ 1051: [HAOI2006]受欢迎的牛( tarjan )
tarjan缩点后, 有且仅有一个出度为0的强连通分量即answer, 否则无解 ----------------------------------------------------------- ...
- bzoj1051: [HAOI2006]受欢迎的牛(tarjan板子)
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6064 Solved: 3179[Submit][Sta ...
- BZOJ1051:受欢迎的牛(并查集 / Tarjan)
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 8161 Solved: 4460 Description ...
- P2341 [HAOI2006]受欢迎的牛(tarjan+缩点)
P2341 [HAOI2006]受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的 ...
随机推荐
- 【从0开始编写webserver·基础篇#03】TinyWeb源码阅读,还是得看看靠谱的项目
[前言] 之前通过看书.看视频和博客拼凑了一个webserver,然后有一段时间没有继续整这个项目 现在在去看之前的代码,真的是相当之简陋,而且代码设计得很混乱,我认为没有必要继续在屎堆上修改了,于是 ...
- 论文日记二:VGG
1. 导读 前面我们回顾了AlexNet,AlexNet的作者指出模型的深度很重要,而VGG最大的贡献就在于对网络模型深度的研究. VGG原论文:<Very Deep Convolutional ...
- 即构SDK5月迭代:新增声道选择、网络探测、智能消噪等功能,打造更优的视听体验
即构SDK5月份的迭代更新如期而至,本月互动视频(LiveRoom).实时语音(AudioRoom)两大SDK以及录制插件(PlayRecord)均有新功能上线.新增的声道选择.变调控制.智能消噪.枚 ...
- 2021-7-29 MySql的简单使用
创建表格 先判断users表是否存在,然后设置user_id为无符号(UNSIGNED)自动增长(AUTO_INCREMENT)的整型 并通过PRIMARY KEY设置user_id为主键 ENG ...
- Node: Module not found: Can't resolve 'xlsx'
报错信息 解决方案 npm install xlsx --save 参考链接 https://github.com/securedeveloper/react-data-export/issues/8 ...
- Django创建超级管理员用户
python manage.py createsuperuser 后面就会提示你输入用户名.邮箱以及密码.
- 一文详解TextBrewer
本文分享自华为云社区<TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术.提供便捷快速的知识蒸馏框架.提升模型的推理速度,减少内存占用>,作者:汀丶. TextBrewer ...
- ChatGPT应用篇:如何快速生成精美PPT提高工作效率-附资料下载
一.ChatGPT生成markdown源代码 问: 我想做一份ChatGPT变现方法的PPT,请生成丰富的教学展示内容,因为生成PPT是需要MarkDown格式的,请您输出Markdown格式的内容 ...
- GaussDB技术解读系列:高安全之密态等值
本文分享自华为云社区< DTCC 2023专家解读 | GaussDB技术解读系列:高安全之密态等值>,作者:GaussDB 数据库. 近日,在第14届中国数据库技术大会(DTCC2023 ...
- CodeForces 1187E Tree Painting
题意:给定一棵\(n\)个点的树 初始全是白点 要求你做\(n\)步操作,每一次选定一个与一个黑点相隔一条边的白点,将它染成黑点,然后获得该白点被染色前所在的白色联通块大小的权值. 第一次操作可以任意 ...