洛谷 P2341 [HAOI2006]受欢迎的牛
来源:互联网 发布:算法新解 pdf 编辑:程序博客网 时间:2024/06/06 20:07
题目背景
Tarjan的模板题。
题目描述
每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶
牛都是自恋狂,每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果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把环缩一下,然后统计出度为零的点,为1则输出答案,更大则这张图不是连通图。
代码
#include<bits/stdc++.h>#define N 50050using namespace std;stack<int> s;int n,m,x,y,top,scc_cnt,T,num_e,num_E;int head[N],Head[N],low[N],dfn[N],num[N],scc[N],cd[N];bool b[N];struct Edge{ int nex,to; Edge(){} Edge(int _,int __):nex(_),to(__){}}e[N],E[N];void add(int x,int y){ e[++num_e]=Edge(head[x],y); head[x]=num_e;}void Add(int x,int y){ E[++num_E]=Edge(Head[x],y); Head[x]=num_E;}void tarjan(int x){ dfn[x]=low[x]=++T;s.push(x); b[x]=true; for(int i=head[x];i;i=e[i].nex){ if(!dfn[e[i].to]){ tarjan(e[i].to); low[x]=min(low[x],low[e[i].to]); } else if(b[e[i].to]) low[x]=min(low[x],dfn[e[i].to]); } if(low[x]==dfn[x]){ int v;scc_cnt++; do{ v=s.top();s.pop(); scc[v]=scc_cnt; num[scc_cnt]++; b[v]=false; }while(v!=x); }}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;++i){ scanf("%d%d",&x,&y); add(x,y); } for(int i=1;i<=n;i++){ if(!dfn[i]){ top=0; tarjan(i); } } for(int i=1;i<=n;i++){ for(int j=head[i];j;j=e[j].nex){ if(scc[i]==scc[e[j].to]) continue; cd[scc[i]]++; Add(scc[i],scc[e[j].to]); } } int numm=0,ans=0; for(int i=1;i<=scc_cnt;i++){ if(cd[i]==0) numm++,ans=i; } if(numm==1) printf("%d",num[ans]); else printf("0"); return 0;}
阅读全文
0 0
- 洛谷 P2341 [HAOI2006]受欢迎的牛
- 洛谷 P2341 [HAOI2006]受欢迎的牛
- 洛谷 P2341 [HAOI2006]受欢迎的牛
- 【洛谷 P2341】[HAOI2006]受欢迎的牛
- BZOJ1051(洛谷P2341) [HAOI2006]受欢迎的牛
- 洛谷P2341 受欢迎的牛
- P2341 受欢迎的牛
- [P2341]受欢迎的牛
- HAOI2006 受欢迎的牛
- [HAOI2006]受欢迎的牛
- [HAOI2006]受欢迎的牛
- [HAOI2006]受欢迎的牛
- [HAOI2006]受欢迎的牛
- [HAOI2006]受欢迎的牛
- [HAOI2006]受欢迎的牛
- [HAOI2006]受欢迎的牛
- [HAOI2006]受欢迎的牛
- 【洛谷 2341】 [HAOI2006]受欢迎的牛
- OpenCV
- javaEE基础
- STM32单片机学习笔记——SysTick系统定时器
- Python实现红黑树
- mybatis简单的增删改查————3
- 洛谷 P2341 [HAOI2006]受欢迎的牛
- Java之阻塞
- 【51Nod1494】选举拉票
- dp小试
- 交叉熵损失函数
- 深入理解计算机系统(CSAPP)读书总结
- hdu 1166 敌兵布阵 线段树
- 用Docker解决坑爹的环境搭建系列——PHP+Apache2
- 一个整数,大于0,不用循环和本地变量,按照n,2n,4n,8n的顺序递增,当值大于5000时,把值按照指定顺序输出来。