1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<stack>
  5. #include<vector>
  6. #include<algorithm>
  7.  
  8. #define N 1000
  9.  
  10. using namespace std;
  11.  
  12. int pre[N],lowlink[N],sccno[N],dfn_clock,scc_cnt;
  13.  
  14. stack<int> stk;
  15.  
  16. vector<int> G[N];
  17.  
  18. void DFN(int u)
  19. {
  20. pre[u] = lowlink[u] = ++dfn_clock; //时间戳
  21. stk.push(u);
  22. int i;
  23. for(i=;i<G[u].size();i++)
  24. {
  25. int v = G[u][i];
  26. if(!pre[v]) //没有访问过
  27. {
  28. DFN(v);
  29. lowlink[u] = min(lowlink[u],lowlink[v]);
  30. }
  31. else if(!sccno[v]) //被访问过,但是不是其他强连通图的组成
  32. {
  33. lowlink[u] = min(lowlink[u],pre[v]);
  34. }
  35. }
  36. if(lowlink[u]==pre[u]) //发现一个强连通分量
  37. {
  38. scc_cnt++; //强连通分量的个数计算
  39. while()
  40. {
  41. int x = stk.top();
  42. stk.pop();
  43. sccno[x] = scc_cnt;
  44. if(x==u) break;
  45. }
  46. }
  47. }
  48.  
  49. void find_scc(int n)
  50. {
  51. dfn_clock = scc_cnt = ;
  52. memset(sccno,,sizeof(sccno));
  53. memset(pre,,sizeof(pre));
  54. int i;
  55. for(i=;i<=n;i++)
  56. if(!pre[i]) DFN(i);
  57. }
  58.  
  59. int main()
  60. {
  61. int n,m;
  62. scanf("%d%d",&n,&m);
  63. int i;
  64. for(i=;i<m;i++)
  65. {
  66. int a,b;
  67. scanf("%d%d",&a,&b);
  68. G[a].push_back(b); //构造图
  69. }
  70. find_scc(n); //查找强连通图
  71. for(i=;i<=n;i++)
  72. printf("%d ",sccno[i]);
  73. putchar();
  74. return ;
  75. }
  76.  
  77. /*
  78. //测试用图
  79. 6 8
  80. 1 3
  81. 3 5
  82. 5 6
  83. 3 4
  84. 4 6
  85. 4 1
  86. 1 2
  87. 2 4
  88. */

强连通分量Tarjan模板的更多相关文章

  1. 强连通分量(Tarjan)模板

    贴模板,备忘. 模板1: #include<iostream> #include<cstring> #include<cmath> #include<cstd ...

  2. 强连通分量(tarjan求强连通分量)

    双DFS方法就是正dfs扫一遍,然后将边反向dfs扫一遍.<挑战程序设计>上有说明. 双dfs代码: #include <iostream> #include <cstd ...

  3. 【Luogu P3387】缩点模板(强连通分量Tarjan&拓扑排序)

    Luogu P3387 强连通分量的定义如下: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶 ...

  4. tarjan求强连通分量(模板)

    https://www.luogu.org/problem/P2341 #include<cstdio> #include<cstring> #include<algor ...

  5. 图的连通性:有向图强连通分量-Tarjan算法

    参考资料:http://blog.csdn.net/lezg_bkbj/article/details/11538359 上面的资料,把强连通讲的很好很清楚,值得学习. 在一个有向图G中,若两顶点间至 ...

  6. 求图的强连通分量--tarjan算法

    一:tarjan算法详解 ◦思想: ◦ ◦做一遍DFS,用dfn[i]表示编号为i的节点在DFS过程中的访问序号(也可以叫做开始时间)用low[i]表示i节点DFS过程中i的下方节点所能到达的开始时间 ...

  7. POJ1236_A - Network of Schools _强连通分量::Tarjan算法

    Time Limit: 1000MS   Memory Limit: 10000K Description A number of schools are connected to a compute ...

  8. 【有向图】强连通分量-Tarjan算法

    好久没写博客了(都怪作业太多,绝对不是我玩的太嗨了) 所以今天要写的是一个高大上的东西:强连通 首先,是一些强连通相关的定义 //来自度娘 1.强连通图(Strongly Connected Grap ...

  9. 有向图强连通分量 Tarjan算法

    [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...

随机推荐

  1. hdu 3440 差分约束

    看完题目第一遍,感觉很简单.当写完程序跑测试用例的时候,发现第二个总是过不了,然后好好研究了一下测试用例,才知道原来不是程序有问题,而是我的建图方式错了.对于这些无序的点,如果高的在右边,不等式是di ...

  2. 转: Lua 语言 15 分钟快速入门

    看点: 1. 以很特殊的方式工,把Lua的语法全部输出一段,很容易让人记住..不错 转: http://blog.jobbole.com/70480/

  3. mac下的常用操作

    打开 应用程序(command+shift+A)-实用工具-终端 open .    直接打开Macintosh系统目录 其他口令(与linux一样)ls                显示当前目录内 ...

  4. double的值太大,以及补0

    当double的值太大的时候,比如1000000000 用DecimalFormat: double d = 1.0E7; System.out.println(new DecimalFormat(& ...

  5. Android 异常捕获

    在用户使用APP时,如果APP毫无征兆的突然退出程序,又没有任何提示信息.我想这是一种最差劲的用户体验了吧,如果是我估计干脆就直接卸载APP了.因此,作为Android开发者对于这种情况的发生一定要有 ...

  6. 使用EntityFramework连接 Mysql

    原文:使用EntityFramework连接 Mysql 1,安装VS.net 插件 http://forums.mysql.com/read.php?174,601041,601041 2,安装连接 ...

  7. LeftOuterJoin和OuterApply性能比较(转)

    建立测试环境: 建立一个表Department和Employee,并向Department插入50W条记录,向Employee插入200W条记录, 我们就拿[统计DepartmentID 从15000 ...

  8. Mingw64编译wxWidgets3.0.2常见错误

    使用Mingw64编译wxWidgets3.0.2,首先得下载wxMSW-Setup-3.0.2.exe(https://sourceforge.net/projects/wxwindows/file ...

  9. CSS 绝对定位和相对定位

    CSS定位属性:一个定位属性,需配合四个定位坐标,实现定位 固定定位fixed 说明: 1.固定定位是相对于"浏览器窗口" 2.如果只设置了定位属性,未指定定位坐标时,元素将停留在 ...

  10. Map的三种遍历方式

    对于Map的三种方式遍历 1.keySet() 2.values() 3.entrySet()三种方式得到Set之后,都可以使用 foreach或者iterator, 不能使用for,因为数据结构决定 ...