有人说这篇博客不是很友好,所以我加了点解释,感觉是不是友好多了?

dfn[u]表示节点u在dfs时被访问的次序。

low[u]表示节点u能够追溯到的最远的祖先的dfn。

ins[u]表示节点u是否在栈中。

belong[u]表示节点u所属的SCC标号,也可以说可以缩成的点的标号。

若u的子节点v可以追溯到节点x(x可能为u的祖先),那么u也可以追溯到节点x。

同时如果是最远祖先那么祖先在dfs中的顺序肯定最小,所以取min值。

如果搜索到的点已经在栈中了,那么当前点的祖先肯定可以是在栈中的点。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <stack>
  4.  
  5. int n, m, cnt, index, ans, size;
  6. int head[], to[], next[], dfn[], low[], belong[];
  7. bool ins[];
  8. std::stack <int> s;
  9.  
  10. inline void add(int x, int y)
  11. {
  12. to[cnt] = y;
  13. next[cnt] = head[x];
  14. head[x] = cnt++;
  15. }
  16.  
  17. void tarjan(int u)
  18. {
  19. dfn[u] = low[u] = ++index;
  20. s.push(u);
  21. ins[u] = ;
  22. int i, v;
  23. for(i = head[u]; i != -; i = next[i])
  24. {
  25. v = to[i];
  26. if(!dfn[v])
  27. {
  28. tarjan(v);
  29. low[u] = std::min(low[u], low[v]);
  30. }
  31. else if(ins[v]) low[u] = std::min(low[u], dfn[v]);
  32. }
  33. if(low[u] == dfn[u])
  34. {
  35. size++;
  36. do
  37. {
  38. v = s.top();
  39. ins[v] = ;
  40. belong[v] = size;
  41. s.pop();
  42. }while(v != u);
  43. }
  44. }
  45.  
  46. int main()
  47. {
  48. int i, x, y;
  49. scanf("%d %d", &n, &m);
  50. memset(head, -, sizeof(head));
  51. for(i = ; i <= m; i++)
  52. {
  53. scanf("%d %d", &x, &y);
  54. add(x, y);
  55. }
  56. for(i = ; i <= n; i++)//有可能是非连通图
  57. if(!dfn[i])
  58. tarjan(i);
  59. printf("%d\n", size);
  60. for(i = ; i <= n; i++) printf("%d ", belong[i]);
  61. return ;
  62. }

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

  1. [模板]tarjan求强连通分量

    大约是今年4月学的算法了,后来5月的时候做题还写了一个退化的tarjanQAQ. 时间复杂度:O(n+m) 用途:有向图缩环 #include<set> #include<cmath ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. SQL SERVER - 谈死锁的监控分析解决思路

    1 背景 1.1 报警情况 最近整理笔记,打算全部迁移到EVERNOTE.整理到锁这一部分,里边刚好有个自己记录下来的案例,重新整理分享下给大家. 某日中午,收到报警短信,DB死锁异常,单分钟死锁12 ...

  2. apicloud上传图片

    //定义api $("#photo").change(function(){ //获取图片 api.getPicture({ sourceType: 'library', enco ...

  3. vs2017 .net core WebApp 去掉ApplicationInsights

    vs2017新建的 .net core WebApp都内置了这个遥测中间件进去,嗯,用AZURE的话是不错能无缝支持.但不用AZURE就没什么用了. 为了不占地方和提高一点点初始启动的速度,对新建的项 ...

  4. 算法模板——splay区间反转 1

    实现的功能:将序列区间反转,并维护 详见BZOJ3223 var i,j,k,l,m,n,head,a1,a2:longint; s1:ansistring; a,b,c,d,fat,lef,rig: ...

  5. Winform自定义控件在界面上拖动、滚动鼠标。。会闪烁的解决方法

    环境说明:   项目中有一个基类窗体BaseForm,有一个自定义控件TextBoxBase,两个控件都做了一些独特常规的封装和重写,在TextBoxBase中有一点重绘的下划线,发现在窗体运行之后, ...

  6. Selenium自动化脚本开发总结

    Selenium Selenium 是ThoughtWorks专门为Web应用程序编写的一个验收测试工具. Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mo ...

  7. C++数据

    const :常量 ~x == -++x == -(x+1)   二进制数,1变为0,0变为1 ^                               相同为0,不同为1 &      ...

  8. Tomcat+Eclipse乱码问题解决方法

    概述 乱码问题是大家在日常开发过程中经常会遇到的问题,由于各自环境的不同,解决起来也费时费力,本文主要介绍一般性乱码问题的解决方法与步骤,开发工具采用Eclipse+Tomcat,统一设置项目编码UT ...

  9. 使用javascript解一道关于会议日程安排的面试题

    这道面试题是从 HarrisonHao 的一篇博文中看到的:原文链接 我看到之后,感觉此题十分有趣,遂自己用 node.js 以不同的思路实现了一遍,实现中使用了 lodash 原题比较长,而且是英文 ...

  10. css颜色代码对照

    FFFFFF #DDDDDD #AAAAAA #888888 #666666 #444444 #000000 #FFB7DD #FF88C2 #FF44AA  #FF0088  #C10066  #A ...