强连通分量:1309. [HAOI2006]受欢迎的牛

★★   输入文件:cow.in   输出文件:cow.out   简单对比
时间限制:1 s   内存限制:128 MB

【题目描述】

每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛 A 认为牛

B受欢迎。这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头牛被所有的牛认为是受欢迎的。

【输入格式】

第1行两个整数N,M;

   接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可能重复,即有可能出现多个A,B)

【输出格式】

一个数,即有多少头牛被所有的牛认为是受欢迎的。

【样例输入】

3 3
1 2
2 1
2 3

【样例输出】

  1. 1

【数据范围】

10%的数据N<=20,M<=50

30%的数据N<=1000,M<=20000

70%的数据N<=5000,M<=50000

100%的数据N<=10000,M<=50000

  1. /*判断能不能有“牛被所有的牛认为是受欢迎”,那就是缩点之后的图中出度为0的点只有一个,如果图中出度为0的点有多个,肯定不符合情况,找出该点之后,再输出该强连通分量即可*/
  2. #include<iostream>
  3. using namespace std;
  4. #include<cstdio>
  5. #include<cstring>
  6. #include<stack>
  7. #define N 10010
  8. #define M 50010
  9. bool in_stack[N];
  10. int low[N],dfn[N],x,y,n,m,father[N];
  11. int chudu[N],t=,topt=,head[N];
  12. struct Edge{
  13. int v,last,u;
  14. }edge[M*];
  15. stack<int>sta;
  16. int ans[N],begi,en;
  17. int read()
  18. {
  19. int sum=,ff=;
  20. char s;
  21. s=getchar();
  22. while(s<''||s>'')
  23. {
  24. if(s=='-') ff=-;
  25. s=getchar();
  26. }
  27. while(s>=''&&s<='')
  28. {
  29. sum=sum*+s-'';
  30. s=getchar();
  31. }
  32. return sum*ff;
  33. }
  34. void add_edge(int u,int v,int k)
  35. {
  36. edge[k].u=u;
  37. edge[k].v=v;
  38. edge[k].last=head[u];
  39. head[u]=k;
  40. }
  41. void input()
  42. {
  43. n=read();m=read();
  44. for(int i=;i<=m;++i)
  45. {
  46. x=read();y=read();
  47. add_edge(x,y,i);
  48. }
  49. }
  50. void tarjan(int u)
  51. {
  52. low[u]=dfn[u]=++topt;
  53. sta.push(u);
  54. in_stack[u]=true;
  55. for(int l=head[u];l;l=edge[l].last)
  56. {
  57. int v=edge[l].v;
  58. if(!dfn[v])
  59. {
  60. tarjan(v);
  61. low[u]=min(low[u],low[v]);
  62. }
  63. else if(in_stack[v])
  64. low[u]=min(low[u],dfn[v]);
  65. }
  66. if(low[u]==dfn[u])
  67. {
  68. ans[++ans[]]=u;
  69. int x;
  70. do
  71. {
  72. x=sta.top();
  73. sta.pop();
  74. in_stack[x]=false;
  75. father[x]=u;
  76. }while(x!=u);
  77. }
  78. }
  79. void suo_dian()
  80. {
  81. for(int l=;l<=m;++l)
  82. {
  83. if(father[edge[l].v]!=father[edge[l].u])
  84. {
  85. chudu[father[edge[l].u]]++;
  86. }
  87. }
  88. }
  89. int main()
  90. {
  91. freopen("cow.in","r",stdin);
  92. freopen("cow.out","w",stdout);
  93. input();
  94. for(int i=;i<=n;++i)
  95. {
  96. if(!dfn[i])
  97. {
  98. tarjan(i);
  99. }
  100. }
  101. suo_dian();
  102. int sum=,l;
  103. for(int i=;i<=ans[];++i)
  104. if(chudu[ans[i]]==)
  105. {
  106. sum++;
  107. l=ans[i];
  108. }
  109. if(sum>) printf("");
  110. else if(sum==)
  111. {
  112. sum=;
  113. for(int i=;i<=n;++i)
  114. if(father[i]==l)
  115. sum++;
  116. printf("%d\n",sum);
  117. }
  118. fclose(stdin);fclose(stdout);
  119. return ;
  120. }

tarjan算法+缩点:求强连通分量 POJ 2186的更多相关文章

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

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

  2. Tarjan算法打包总结(求强连通分量、割点和Tarjan-LCA)

    目录 Tarjan打包总结(求强连通分量.割点和Tarjan-LCA) 强连通分量&缩点 原理 伪代码 板子(C++) 割点 原理 伪代码 最近公共祖先(LCA) 原理 伪代码 板子 Tarj ...

  3. Tarjan求强连通分量,缩点,割点

    Tarjan算法是由美国著名计算机专家发明的,其主要特点就是可以求强连通分量和缩点·割点. 而强联通分量便是在一个图中如果有一个子图,且这个子图中所有的点都可以相互到达,这个子图便是一个强连通分量,并 ...

  4. poj 2186 tarjan求强连通分量

    蕾姐讲过的例题..玩了两天后才想起来做 貌似省赛之后确实变得好懒了...再努力两天就可以去北京玩了! 顺便借这个题记录一下求强连通分量的算法 1 只需要一次dfs 依靠stack来实现的tarjan算 ...

  5. tarjan求强连通分量+缩点+割点以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...

  6. tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...

  7. HDU 1827 Summer Holiday(tarjan求强连通分量+缩点构成新图+统计入度+一点贪心思)经典缩点入门题

    Summer Holiday Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  8. tarjan算法-解决有向图中求强连通分量的利器

    小引 看到这个名词-tarjan,大家首先想到的肯定是又是一个以外国人名字命名的算法.说实话真的是很佩服那些算法大牛们,佩服得简直是五体投地啊.今天就遇到一道与求解有向图中强连通分量的问题,我的思路就 ...

  9. Tarjan 算法求 LCA / Tarjan 算法求强连通分量

    [时光蒸汽喵带你做专题]最近公共祖先 LCA (Lowest Common Ancestors)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili tarjan LCA - YouTube Tarj ...

随机推荐

  1. iis到w3wp的数据流及工作原理

    HTTP.sys->IO线程-CLR线程池中的worker线程处理 IO线程只负责把请求交给Worker线程或者放入进程池级别的队列,然后又去HTTP.SYS的队列中处理其它的请求

  2. C++ Qt 框架静态编译 操作记录

    谁愿意写个程式出来之后还附带一堆DLL,尤其是名字如此明显的名字. 于是在网上看了看,是需要下载源代码然后进行编译的,但是看了看别人说的编译时间,长达几个小时,瞬间就感觉不想做了.因为我还需要抓紧时间 ...

  3. jetty加载spring-context容器源码分析

    带着疑问开始 web.xml的顺序问题 先拿一个最简单的spring mvc web.xml来说问题,如下图:如果我将三者的顺序倒置或是乱置,会产生什么结果呢? 启动报错?还是加载未知结果?还是毫无影 ...

  4. 【poj 3461】Oulipo(字符串--KMP)

    题意:求子串在文本串中出现了多少次. 解法:使用KMP的next[ ]和tend[ ]数组计数. #include<cstdio> #include<cstdlib> #inc ...

  5. double 类型转化为Integer类型 ---DecimalFormat

    假设x是你要转换的double类型变量: 不进行四舍五入操作: (int)x 进行四舍五入操作: Integer.parseInt(new java.text.DecimalFormat(" ...

  6. php面试题之一——PHP核心技术(高级部分)

    一.PHP核心技术 1.写出一个能创建多级目录的PHP函数(新浪网技术部) <?php /** * 创建多级目录 * @param $path string 要创建的目录 * @param $m ...

  7. J2EE分布式架构及MySQL交流群

    J2EE分布式架构及MySQL交流群:577913057

  8. SharePoint 2013 新功能探索 之 标注控件

    SharePoint 2013 引入了新的UI,同时也跟进了网络潮流,把应用最广泛的标注控件也引入到了SharePoint,先看两个应用    以上是两个开发当中经常会用到,下面就介绍一下如何开发相同 ...

  9. SharePoint 网站登录不上,3次输入用户名/密码白页

    新搭建的SharePoint 2013环境,第一次干的这么憋屈的慌,先是接了一个Ghost的服务器,装好的服务器.Sql.SharePoint.VS等一系列,却发现怎么都登陆不上去,输入账号3次以后白 ...

  10. dp和px以及sp

    dp(dip): device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不依赖 ...