题意:

      有一群老牛,给你一些关系,a b表示牛a仰慕牛b,最后问你有多少个牛是被所有牛仰慕的。

思路:

      假如这些仰慕关系不会出现环,那么当且仅当只有一只牛的出度为0的时候答案才是1,都则就是0,再假设所有的关系正好组成了一个环,那么就是说明每只牛都没其他所有牛仰慕,那么答案就是n,所以我们可以像强联通缩点之后看是否有且仅有一个出度为0的,如果有那么答案就是那个强联通分量的元素个数,否则就是0,因为同一个强联通里面的点有着相同的性质.


  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stack>
  4. #define N_node 10000 + 100
  5. #define N_edge 50000 + 500
  6. using namespace std;
  7. typedef struct
  8. {
  9. int to ,next;
  10. }STAR;
  11. typedef struct
  12. {
  13. int a ,b;
  14. }EDGE;
  15. STAR E1[N_edge] ,E2[N_edge];
  16. EDGE edge[N_edge];
  17. int list1[N_node] ,list2[N_node] ,tot;
  18. int Belong[N_node] ,cont;
  19. int out[N_node] ,sum[N_node];
  20. int mark[N_node];
  21. stack<int>st;
  22. void add(int a ,int b)
  23. {
  24. E1[++tot].to = b;
  25. E1[tot].next = list1[a];
  26. list1[a] = tot;
  27. E2[tot].to = a;
  28. E2[tot].next = list2[b];
  29. list2[b] = tot;
  30. }
  31. void DFS1(int s)
  32. {
  33. mark[s] = 1;
  34. for(int k = list1[s] ;k ;k = E1[k].next)
  35. {
  36. int to = E1[k].to;
  37. if(!mark[to])DFS1(to);
  38. }
  39. st.push(s);
  40. }
  41. void DFS2(int s)
  42. {
  43. Belong[s] = cont;
  44. sum[cont] ++;
  45. mark[s] = 1;
  46. for(int k = list2[s] ;k ;k = E2[k].next)
  47. {
  48. int to = E2[k].to;
  49. if(!mark[to]) DFS2(to);
  50. }
  51. }
  52. int main ()
  53. {
  54. int n ,m ,a ,b ,i;
  55. while(~scanf("%d %d" ,&n ,&m))
  56. {
  57. memset(list1 ,0 ,sizeof(list1));
  58. memset(list2 ,0 ,sizeof(list2));
  59. tot = 1;
  60. for(i = 1 ;i <= m ;i ++)
  61. {
  62. scanf("%d %d" ,&a ,&b);
  63. add(a ,b);
  64. edge[i].a = a;
  65. edge[i].b = b;
  66. }
  67. while(!st.empty())
  68. st.pop();
  69. memset(mark ,0 ,sizeof(mark));
  70. for(i = 1 ;i <= n ;i ++)
  71. if(!mark[i])DFS1(i);
  72. cont = 0;
  73. memset(mark ,0 ,sizeof(mark));
  74. memset(sum ,0 ,sizeof(sum));
  75. while(!st.empty())
  76. {
  77. int to = st.top();
  78. st.pop();
  79. if(!mark[to])
  80. {
  81. cont ++;
  82. DFS2(to);
  83. }
  84. }
  85. memset(out ,0 ,sizeof(out));
  86. for(i = 1 ;i <= m ;i ++)
  87. {
  88. a = Belong[edge[i].a];
  89. b = Belong[edge[i].b];
  90. if(a == b) continue;
  91. out[a] ++;
  92. }
  93. int ss = 0 ,mk = -1;
  94. for(i = 1 ;i <= cont ;i ++)
  95. {
  96. if(!out[i])
  97. {
  98. ss ++;
  99. mk = i;
  100. }
  101. }
  102. if(ss == 1) printf("%d\n" ,sum[mk]);
  103. else printf("0\n");
  104. }
  105. return 0;
  106. }

POJ2186 强联通的更多相关文章

  1. poj2186强联通(牛仰慕)

    题意:       有一群老牛,他们之间有m组敬仰关系,关系可以传递,a仰慕b,b仰慕c,那么a就仰慕c,现在问被所有老牛都仰慕 的有多少? 思路:       想想,是不是一个环中的老牛的关系都是一 ...

  2. Kosaraju算法---强联通分量

    1.基础知识 所需结构:原图.反向图(若在原图中存在vi到vj有向边,在反向图中就变为vj到vi的有向边).标记数组(标记是否遍历过).一个栈(或记录顶点离开时间的数组).      算法描叙: :对 ...

  3. [CF #236 (Div. 2) E] Strictly Positive Matrix(强联通分量)

    题目:http://codeforces.com/contest/402/problem/E 题意:给你一个矩阵a,判断是否存在k,使得a^k这个矩阵全部元素都大于0 分析:把矩阵当作01矩阵,超过1 ...

  4. 强联通 poj 2762

    t个样例    (注意清零) n个点m条边 有向; 任意2点是否能从a->b或者b->a; Yes  No #include<stdio.h> #include<algo ...

  5. UVa 11324 & 强联通分量+DP

    题意: 一张无向图,求点集使其中任意两点可到达. SOL: 强联通分量中的点要么不选要么全都选,然后缩点DAG+DP 记录一下思路,不想写了...代码满天飞.

  6. BZOJ 1051 & 强联通分量

    题意: 怎么说呢...这种题目有点概括不来....还是到原题面上看好了... SOL: 求出强联通分量然后根据分量重构图,如果只有一个点没有出边那么就输出这个点中点的数目. 对就是这样. 哦还有论边双 ...

  7. 洛谷 P2661 信息传递 Label:并查集||强联通分量

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  8. POJ 1236-Network of Schools (图论-有向图强联通tarjan)

    题目链接:http://poj.org/problem?id=1236 题目大意:N(2<N<100)个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输.问题 ...

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

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

随机推荐

  1. 解读KMP算法

    前后断断续续搞了5个月,每次都以为自己懂了, 但是要写的时候都不知从何下手,然后又是各种找博客,看帖子,所以这次试着用自己的语言写一个博客. 首先,KMP算法就是从一个模板字符串(S) 中匹配目标字符 ...

  2. 剑指 Offer 39. 数组中出现次数超过一半的数字 + 摩尔投票法

    剑指 Offer 39. 数组中出现次数超过一半的数字 Offer_39 题目描述 方法一:使用map存储数字出现的次数 public class Offer_39 { public int majo ...

  3. 【转载】Android异步消息处理机制详解及源码分析

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  4. 记一次Linux内核崩溃:kdump,crash,vmcore

    原理 Linux内核发送崩溃时,kdump会生成一个内核转储文件vmcore. 可以通过分析vmcore分析出内核崩溃的原因. crash是一个被广泛应用的内核奔溃转储文件分析工具.使用crash调试 ...

  5. 如何自学成 Python 大神?这里有些建议

    人生苦短,我用 Python.为什么?简单明了的理由当然是开发效率高.但是学习 Python 的初学者往往会面临以下残酷的现状:网上充斥着大量的学习资源.书籍.视频教程和博客,但是大部分都是讲解基础知 ...

  6. FreeBSD 包管理器设计简介

    熟悉 Linux 的人也许会发现,FreeBSD 的包管理方案实际上大约等于以下两大 Linux 发行版包管理器的完美合体: Arch: pacman,对应 pkg(秉承同样的 KISS 理念) Ge ...

  7. gsoap多wsdl集成

    gsoap常规用法: 通过wsdl文件创建头文件 //通过wsdl文件创建头文件 wsdl2h [options] -o file.h ... WSDL and XSD files or URLs t ...

  8. python函数之有参装饰器

    一.为什么要有有参装饰器? 来看之前的无参装饰器 # 无参装饰器 def outter(func): def wrapper(*args,**kwargs): start = time.time() ...

  9. python基础之赋值运算

    之前的文章说明了变量的三大组成部分,详细说明了变量名与变量值,但是对于赋值这一块介绍相对较少,今天就来对这一部分进行补充,除了egon老湿所讲之外,本喵还参阅了<python3-cookbook ...

  10. Android Studio之显示本地时间

    •效果展示图 •代码 1 package com.example.table; 2 3 import android.os.Bundle; 4 import android.os.Handler; 5 ...