题目链接:http://poj.org/problem?id=2186

题目大意:给定N头牛和M个有序对(A,B),(A,B)表示A牛认为B牛是红人,该关系具有传递性,如果牛A认为牛B是红人,牛B认为牛C是红人,那么牛A也认为牛C是红人。求被其他所有牛认为是红牛的牛的总数。

解题思路:把所有牛看成顶点,把有序对(A,B)看成从A到B的有向边,那么题目就变成了求所有顶点都可到达的顶点的总数。我们可以得到一个结论,如果一个强连通分量里有一头牛被认为是红人,那么该强联通分量里的所有牛都是红人,这显然是正确的。由于我用的是Kosaraju求强联通分量,根据该算法性质,红牛只会在拓扑序最后的强联通分量里,我只需要找到最后一块强联通分量,取其中一个顶点,看是否所有点都可以到达即可。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<vector>
  5. using namespace std;
  6. const int N=1e4+;
  7.  
  8. vector<int>G[N];//图的邻接表
  9. vector<int>rG[N];//反向图的邻接表
  10. vector<int>vs;//后序遍历的顺序的顶点列表
  11. bool used[N];//记录点是否被访问
  12. int cmp[N];//cmp[i]表示点i所属强联通分量的拓扑序
  13.  
  14. int V,E;
  15.  
  16. void addedge(int u,int v){
  17. G[u].push_back(v);
  18. rG[v].push_back(u);
  19. }
  20.  
  21. void dfs(int v){
  22. used[v]=true;
  23. for(int i=;i<G[v].size();i++){
  24. if(!used[G[v][i]])
  25. dfs(G[v][i]);
  26. }
  27. //回溯前进行标号
  28. vs.push_back(v);
  29. }
  30.  
  31. void rdfs(int v,int k){
  32. used[v]=true;
  33. //点v属于第k个强连通分量
  34. cmp[v]=k;
  35. for(int i=;i<rG[v].size();i++){
  36. if(!used[rG[v][i]])
  37. rdfs(rG[v][i],k);
  38. }
  39. }
  40.  
  41. int scc(){
  42. memset(used,false,sizeof(used));
  43. vs.clear();
  44. //第一次DFS
  45. for(int i=;i<=V;i++){
  46. if(!used[i])
  47. dfs(i);
  48. }
  49. memset(used,false,sizeof(used));
  50. int k=;//强联通分量块数
  51. //第二次DFS
  52. for(int i=vs.size()-;i>=;i--){
  53. if(!used[vs[i]])
  54. rdfs(vs[i],++k);
  55. }
  56. return k;
  57. }
  58.  
  59. void solve(){
  60. //获得强联通块数
  61. int n=scc();
  62. //统计备选解的个数
  63. int u=,num=;
  64. for(int i=;i<=V;i++){
  65. if(cmp[i]==n){
  66. u=i;
  67. num++;
  68. }
  69. }
  70. //检查是否所有点可达
  71. memset(used,,sizeof(used));
  72. rdfs(u,);
  73.  
  74. for(int i=;i<=V;i++){
  75. if(!used[i]){
  76. num=;
  77. break;
  78. }
  79. }
  80. for(int i=;i<=V;i++){
  81. cout<<"i="<<i<<" cmp="<<cmp[i]<<endl;
  82. }
  83. printf("%d\n",num);
  84. }
  85.  
  86. int main(){
  87. scanf("%d%d",&V,&E);
  88. for(int i=;i<=E;i++){
  89. int u,v;
  90. scanf("%d%d",&u,&v);
  91. addedge(u,v);
  92. }
  93. solve();
  94. return ;
  95. }

POJ 2186 Popular cows(Kosaraju+强联通分量模板)的更多相关文章

  1. POJ 2186 Popular Cows(强联通+缩点)

    Description Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= ...

  2. 强连通分量分解 Kosaraju算法 (poj 2186 Popular Cows)

    poj 2186 Popular Cows 题意: 有N头牛, 给出M对关系, 如(1,2)代表1欢迎2, 关系是单向的且能够传递, 即1欢迎2不代表2欢迎1, 可是假设2也欢迎3那么1也欢迎3. 求 ...

  3. POJ 2186 Popular Cows(强联通分量)

    题目链接:http://poj.org/problem?id=2186 题目大意:    每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种 ...

  4. POJ 2186 Popular Cows (强联通)

    id=2186">http://poj.org/problem? id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 655 ...

  5. poj 2186 Popular Cows (强连通分量+缩点)

    http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissi ...

  6. [强连通分量] POJ 2186 Popular Cows

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 31815   Accepted: 12927 De ...

  7. POJ 2186-Popular Cows (图论-强联通分量Korasaju算法)

    题目链接:http://poj.org/problem?id=2186 题目大意:有n头牛和m对关系, 每一对关系有两个数(a, b)代表a牛认为b牛是“受欢迎”的,且这种关系具有传递性, 如果a牛认 ...

  8. POJ 2186 Popular Cows(强连通分量缩点)

    题目链接:http://poj.org/problem?id=2186 题目意思大概是:给定N(N<=10000)个点和M(M<=50000)条有向边,求有多少个“受欢迎的点”.所谓的“受 ...

  9. poj 2186 Popular Cows 【强连通分量Tarjan算法 + 树问题】

    题目地址:http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Sub ...

随机推荐

  1. 【WPF】GridControl的使用

    一.前言 在WPF中我们常常使用DataGrid来显示数据,在Dev中也有一个类似的控件—GridControl. 二.范例 <dxg:GridControl Grid.Row=" I ...

  2. Linux内核分析第二周--操作系统是如何工作的

    Linux内核分析第二周--操作系统是如何工作的 李雪琦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...

  3. python基础----isinstance(obj,cls)和issubclass(sub,super)、反射、__setattr__,__delattr__,__getattr__、二次加工标准类型(包装)

    一.isinstance(obj,cls)和issubclass(sub,super)                                isinstance(obj,cls)检查是否ob ...

  4. UVA11426 GCD - Extreme (II) (欧拉函数/莫比乌斯反演)

    UVA11426 GCD - Extreme (II) 题目描述 PDF 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 10 100 200000 0 输出样例#1: 67 13 ...

  5. VS集成opencv编译C++项目遇到的问题

    当我们新建一个c++项目的时候总是提示脚本错误的信息,虽然不影响使用,但是还是很烦躁,对于有强迫症的我来说,实在受不了,终于找到了解决方案 这个提示的路径根据大家自己安装vs的路径来查找: http: ...

  6. animatescroll.min.js ~~~~ jq滚动效果 优化target自定义方法

    $(".meun>div[name='meun_nav']>a").eq(1).on("click",function(){ $("bod ...

  7. 「Linux」VMware安装centos7(二)

    一.检查是否联网 命令:ping www.baidu.com 二.查询系统中的地址信息 命令:ip addr 三.查看当前网络连接 命令:nmcli connection show 四.设置网络连接 ...

  8. bootstrap 栅格calss

    container container-fluid row col-xs- col-sm- col-md- col-lg- col-md-offset- col-md-push- col-md-pul ...

  9. Tensorflow BatchNormalization详解:2_使用tf.layers高级函数来构建神经网络

    Batch Normalization: 使用tf.layers高级函数来构建神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 吴恩达deeplearningai课程 课程笔 ...

  10. CF540 B 贪心

    坑在B题是常态,弱智的日常. 是找中位数不是平均值. 慌了,乱写了 出了一塌糊涂的ZZ代码 特记一下 /** @Date : 2017-08-27 17:25:11 * @FileName: B.cp ...