Popular Cows POJ 2186(强连通分解)
原题
原题链接
题目大意
题目会给一个牛的有向图,A→B意味着A认为B流行,如果A→B,B→C,则A和B都认为C流行,要求求出这群牛中被所有牛认为流行的牛的数.
题目分析
这道题中会存在一些情况例如 A→B,B→C,C→A这种,就是A B C强连通,所以需要把这些强连通的点集压缩成一个点并进行拓扑排序,然后只要找序列中的最后一个点,用dfs检查一遍是否能跑遍全图,是则输出该点被压缩的数量,否则输出0.找强连通可以先用dfs扫一下有向图(确保所有点都被该dfs扫过),再将地图上的所有路反向,再用dfs从上次dfs的第一个开始,扫遍所有的点,这次每扫一次dfs都能求解出一个强连通分量,因为路方向后,只有强连通里的点不受影响,各个强连通分量都会被隔绝,因此可以找出所有的强连通分量.
代码
1 #include <cstdio> 2 #include <cmath> 3 #include <iostream> 4 #include <cstring> 5 #include <algorithm> 6 #include <vector> 7 #include <string> 8 #include <utility> 9 #include <queue> 10 #include <stack> 11 #include <map> 12 const int INF=0x3f3f3f3f; 13 using namespace std; 14 15 vector<int> G[10001],rG[10001]; //G是放输入边的,rG是放反向后的边的 16 vector<int> vs; //用来存第一次dfs 点的遍历顺序 17 bool vis[10001]; //检查点是否扫过 18 int cmp[10001]; //表示拓扑排序中的序号 19 20 void add(int from,int to) //添加边 21 { 22 G[from].push_back(to); 23 rG[to].push_back(from); 24 } 25 26 void dfs(int s) //第一次dfs 27 { 28 vis[s]=true; 29 for(int i=0;i<G[s].size();i++) 30 if(!vis[G[s][i]]) dfs(G[s][i]); 31 vs.push_back(s); 32 } 33 34 void rdfs(int s,int k) //第二次dfs k是拓扑排序序号 35 { 36 vis[s]=true; 37 cmp[s]=k; 38 for(int i=0;i<rG[s].size();i++) 39 if(!vis[rG[s][i]]) rdfs(rG[s][i],k); 40 } 41 42 int main() 43 { 44 int n,m; 45 cin>>n>>m; 46 while(m--) 47 { 48 int a,b; 49 scanf("%d%d",&a,&b); 50 add(a,b); 51 } 52 53 for(int i=1;i<=n;i++) 54 if(!vis[i]) dfs(i); 55 56 memset(vis,0,sizeof(vis)); 57 int k=0; 58 59 for(int i=vs.size()-1;i>=0;i--) 60 if(!vis[vs[i]]) rdfs(vs[i],k++); 61 62 int u,ans=0; //找出拓扑序列最后一个点 63 for(int i=1;i<=n;i++) 64 if(cmp[i]==k-1) u=i,ans++; 65 66 //检查最后一个强连通分量上的一个点能否经过所有的点(即被所有牛认为流行) 67 memset(vis,0,sizeof(vis)); 68 rdfs(u,0); 69 for(int i=1;i<=n;i++) 70 if(!vis[i]) 71 { 72 ans=0; 73 break; 74 } 75 cout<<ans<<endl; 76 return 0; 77 }
转载于:https://www.cnblogs.com/VBEL/p/10497655.html
Popular Cows POJ 2186(强连通分解)相关推荐
- Popular Cows POJ - 2186(tarjan算法)+详解
题意: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有 N头牛,给你M对整数(A,B),表示牛 A认为牛B受欢迎.这种关系是具有传递性的,如果 A认为 B受欢迎, B认为 C受欢迎,那么牛 A也认为牛 ...
- poj 2186 强连通分量
poj 2186 强连通分量 传送门 Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 33414 Acc ...
- poj 2186(强连通分量)
题意: n头奶牛,给出若干个欢迎关系a b,表示a欢迎b,欢迎关系是单向的,但是是可以传递的,如:a欢迎b,b欢迎c,那么a欢迎c .另外每个奶牛都是欢迎他自己的.求出被所有的奶牛欢迎的奶牛的数目. ...
- Poj 2186 Popular Cows(Tarjan 强连通缩点)
传送门:Poj 2186 题意:给你n头牛,m种关系,A牛认为B牛是popular的,B牛认为C牛是popular的,则A也认为C是popular的,问最终有几头被所有牛认为是popular的牛 题解 ...
- 洛谷——P2341 [HAOI2006]受欢迎的牛//POJ2186:Popular Cows
P2341 [HAOI2006]受欢迎的牛/POJ2186:Popular Cows 题目背景 本题测试数据已修复. 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所 ...
- POJ 2481 Cows POJ 2352 Stars(树状数组妙用)
题目链接:POJ 2481 Cows POJ 2352 Stars 发现这两个题目都跟求逆序数有着异曲同工之妙,通过向树状数组中插入点的位置,赋值为1,或者++,然后通过求和来判断比当前 点 &quo ...
- 动态规划训练20 [Treats for the Cows POJ - 3186 ]
Treats for the Cows POJ - 3186 简单的区间DP,就不解释了. #include<iostream> #include<cstdio> using ...
- POJ NOI0105-43 质因数分解
问题链接:POJ NOI0105-43 质因数分解. 总时间限制: 1000ms 内存限制: 65536kB 描述 已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数.输入 输入只有一行, ...
- POJ 2186 Popular Cows(强连通分量缩点,Tarjan算法)
[题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=16578 [解题报告] 给你一个有向图,问你有多少个点可以被其它 ...
最新文章
- 用 Parser Combinator 解析 Cirru 的缩进语法
- 如何清除word复制过来的文字背景色的好方法?
- rgb cmyk lab的区别
- 201521123087 蒋勃超 软工作业
- 如何用Pygame写游戏(十)
- IOS UI 第三篇:基本UI
- 使用Task简化Silverlight调用Wcf
- logstash收集java日志,多行合并成一行
- 学会这个python数字大全,让你不再发愁
- 夜神无限检查服务器新版本,夜神模拟器电脑最新版
- 穿越“惊世骇俗”的美景
- 抖音自拍特效如何java实现_抖音特效在 Web 端的实现
- 应用后台被回收,点击崩溃
- 计算机操作系统笔记第八章磁盘存储器的管理
- Flash----读写外部Flash
- 程序员转正述职报告_程序员转正的述职报告【五篇】
- 好文分享 努力从何时开始都不晚 跟自己比 不断进步
- Amazon Prime Video为《周四橄榄球之夜》推出新功能,让全球NFL球迷能够自定义流媒体播放体验
- 倒霉。。。倒霉。。。。。
- oracle原理视频,[Oracle] 甲骨论 价值1.67万的Oracle视频课程 共46节课