https://www.luogu.org/problem/P2341

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int maxn=;
  6. int pre[maxn],other[maxn],last[maxn],l;
  7. int n,m;
  8. int dfn[maxn],low[maxn],ans[maxn],st[maxn],belong[maxn],cnt,top,qw;
  9. //dfn->dfs序,low是点上非树边指向的点(拥有最小的dfs序 ),st是一个栈,记录环上的点,belong是点所属于的环
  10. void add(int x,int y)
  11. {
  12. l++;
  13. pre[l]=last[x];
  14. last[x]=l;
  15. other[l]=y;
  16. }
  17. int ru[maxn],chu[maxn];//入度,出度
  18. void dfs(int x)
  19. {
  20. dfn[x]=low[x]=++cnt;//可以知道每个点都指向自己(low)
  21. ru[x]=;
  22. st[++top]=x;
  23. for(int p=last[x];p;p=pre[p])
  24. {
  25. int v=other[p];
  26. if(!dfn[v])
  27. {
  28. dfs(v);//此时v的信息已经更新完毕
  29. low[x]=min(low[x],low[v]);//用儿子更新父亲
  30. }
  31. else if(ru[v])//儿子不在环上,因为环上的点low是没有意义的
  32. {
  33. low[x]=min(low[x],dfn[v]);
  34. }
  35. }
  36. if(dfn[x]==low[x])//说明这是一个环
  37. {
  38. belong[x]=++qw;//qw是环的个数
  39. while()
  40. {
  41. int y=st[top--];
  42. ru[y]=;
  43. belong[y]=qw;
  44. ans[qw]++;
  45. if(x==y) break;
  46. }
  47. }
  48. }
  49.  
  50. int main()
  51. {
  52. scanf("%d%d",&n,&m);
  53. for(int i=;i<=m;i++)
  54. {
  55. int a,b;
  56. scanf("%d%d",&a,&b);
  57. add(a,b);//时刻注意是有向边
  58. }
  59. for(int i=;i<=n;i++)
  60. {
  61. if(!dfn[i]) dfs(i);//此操作是防止图不连通
  62. }
  63. for(int i=;i<=n;i++)
  64. {
  65. for(int p=last[i];p;p=pre[p])
  66. {
  67. int v=other[p];
  68. if(belong[i]!=belong[v])//实际上可以把一个环看成一个点(子环就是一个点)
  69. {
  70. chu[belong[i]]++;//有向边
  71. }
  72. }
  73. }
  74. int p=;//因为要所有牛都喜欢,所以只允许一个环的出现
  75. for(int i=;i<=qw;i++)
  76. {
  77. if(!chu[i])
  78. {
  79. if(p!=)
  80. {
  81. printf("0\n");
  82. return ;
  83. }
  84. p=i;
  85. }
  86. }
  87. printf("%d\n",ans[p]);
  88. return ;
  89. }
  90.  
  91. /*
  92. tarjan求强连通分量;
  93. 这个板子就是在一个有向图中,找到一个所有点直接或间接指向的一个点
  94. (实际上可以是一个环,可以想象一个有向环,上面有许多“枝条”,
  95. 这样所有环上的点都直接或间接指向环上的点,然后所有枝条上的点都直接或间接指向环上的点;
  96. 那么环上的点就是那些所有点都直接或间接指向的)
  97. */

tarjan求强连通分量(模板)的更多相关文章

  1. tarjan求强连通分量模板

    什么是强连通分量? 百度百科 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(stro ...

  2. Tarjan求强连通分量、求桥和割点模板

    Tarjan 求强连通分量模板.参考博客 #include<stdio.h> #include<stack> #include<algorithm> using n ...

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

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

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

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

  5. UVALive 4262——Trip Planning——————【Tarjan 求强连通分量个数】

    Road Networks Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Stat ...

  6. UESTC 901 方老师抢银行 --Tarjan求强连通分量

    思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大.所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个D ...

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

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

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

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

  9. CCF 高速公路 tarjan求强连通分量

    问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的 ...

随机推荐

  1. 解决 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 以及MyBatis批量加载xml映射文件的方式

    错误 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 的出现,意味着项目需要xml文件来 ...

  2. 从业务流程角度:分析TMS系统各个功能模块

    TMS的主要功能是协调承运商.运营商.货主三种角色人员分工合作共同完成运输任务,并实现对运输任务的跟踪管理.本文将按照业务流程顺序对TMS系统各个功能模块进行分析说明. 一.业务描述 新零售的兴起及& ...

  3. 怎样理解window.name

    window.name表示当前窗口的名字, 而非网页的名字, 网页的名字需要使用: document.title; window.name一般是空的字符串, 他的作用其实是配合配合超链接和表单的tar ...

  4. [Vue]axios 发出请求的config

    这些是用于发出请求的可用配置选项. 只有url是必需的. 如果未指定方法,请求将默认为GET. { // `url`是将用于请求的服务器URL url: '/user', // `method`是发出 ...

  5. office2019激活码 最新各个版本激活码

    office2019专业版激活码 激活秘钥 一.office2019激活6月更新 [Key]:F4QWT-NMMKH-XPTV9-W9HFB-B4JCQ [剩余次数:900000+] office20 ...

  6. C#通过地址获取省市区(基于百度地图API)

    最近公司有个需求,想通过地址获取对应的省市区,本来想直接通过对地址的截取,对于完整的地址还可以,不完整的就没法用了 所以本篇通过百度地图API来获取地址 第一步:申请ak密钥 登录百度地图开放平台,按 ...

  7. Python考试_第三次

    - python 全栈11期月考题 一 基础知识:(70分) 1.文件操作有哪些模式?请简述各模式的作用(2分) 2.详细说明tuple.list.dict的用法,以及它们的特点(3分) 3.解释生成 ...

  8. ipp 实现图像空间的转换

    下载:https://software.intel.com/en-us/parallel-studio-xe/choose-download/free-trial-cluster-windows-c- ...

  9. 媲美pandas的数据分析工具包Datatable

    1 前言 data.table 是 R 中一个非常通用和高性能的包,使用简单.方便而且速度快,在 R 语言社区非常受欢迎,每个月的下载量超过 40 万,有近 650 个 CRAN 和 Biocondu ...

  10. Bootstrap+Hbuilder

    出处:http://blog.csdn.net/antony9118/article/details/52189525 1 BootStrap的优点 BootStrap是现在最受欢迎的前端框架,对cs ...