Tarjan求强连通分量

在一个有向图中,如果某两点间都有互相到达的路径,那么称中两个点强联通,如果任意两点都强联通,那么称这个图为强联通图;一个有向图的极大强联通子图称为强联通分量

  算法可以在 的时间内求出一个图的所有强联通分量。

表示进入结点 的时间

表示从 所能追溯到的栈中点的最早时间

如果某个点 已经在栈中则更新 

否则对 进行回溯,并在回溯后更新 

  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<stack>
  8. using namespace std;
  9.  
  10. int n,m,tot,ind,ans;
  11. int dfn[200005],low[200005],last[200005];
  12. bool ins[200005];
  13. stack<int> s;
  14. struct hh
  15. {
  16. int fr,to,next;
  17. }e[500005];
  18. void add(int fr,int to)
  19. {
  20. e[++tot].to=to;e[tot].fr=fr;
  21. e[tot].next=last[fr];
  22. last[fr]=tot;
  23. }
  24. void tarjan(int now)
  25. {
  26. int i,j;
  27. s.push(now);
  28. ins[now]=true;
  29. low[now]=dfn[now]=++dex;
  30. for(i=last[now];i;i=e[i].next)
  31. if(!dfn[e[i].to])
  32. {
  33. tarjan(e[i].to);
  34. low[now]=min(low[now],low[e[i].to]);
  35. }
  36. else if(ins[e[i].to])low[now]=min(low[now],dfn[e[i].to]);
  37.  
  38. if(dfn[now]==low[now])
  39. {
  40. cnt=0;
  41. do
  42. {
  43. j=s.top();s.pop();
  44. ins[j]=false;
  45. cnt++;
  46. }while(j!=now);
  47. ans=max(ans,cnt);
  48. }
  49. }
  50. int main()
  51. {
  52. int i,j,u,v;
  53. scanf("%d%d",&n,&m);
  54. for(i=1;i<=m;i++)
  55. {
  56. scanf("%d%d",&u,&v);
  57. add(u,v);
  58. }
  59. for(i=1;i<=n;i++)
  60. if(!dfn[i]) tarjan(i);
  61. printf("%d",ans);
  62. return 0;
  63. }

Tarjan求割点

在一个无向图中,如果删掉点 后图的连通块数量增加,则称点 为图的割点

对于搜索树上的非根结点 ,如果存在子节点 满足   ,即 向上无法达到 的祖先,则 为割点。

对于搜索树上的根节点,若它的子节点数 ,则 为割点。

  1. void tarjan(int x,int fa)
  2. {
  3. int i,j;
  4. dfn[x]=low[x]=++dex;
  5. for(i=last[x];i;i=e[i].next)
  6. {
  7. ++t[x];
  8. if(!dfn[e[i].to])
  9. {
  10. tarjan(e[i].to,x);
  11. low[x]=min(low[x],low[e[i].to]);
  12. if(x==root&&t[x]>=2) opt[x]=true;
  13. else if(x!=root&&low[e[i].to]>=dfn[x]) opt[x]=true;
  14. }
  15. else if(e[i].to!=fa) low[x]=min(low[x],dfn[e[i].to]);
  16. }
  17. }

Tarjan求割边

对于当前结点 ,若邻接点中存在结点 满足 ,则 为割边。

  1. void tarjan(int x,int fa)
  2. {
  3. int i,j;
  4. low[x]=dfn[x]=++dex;
  5. for(i=last[x];i;i=e[i].next)
  6. if(e[i].to!=fa)
  7. {
  8. if(dfn[e[i].to]) low[x]=min(low[x],dfn[e[i].to]);
  9. else
  10. {
  11. tarjan(e[i].to,x);
  12. low[x]=min(low[x],low[e[i].to]);
  13. if(low[e[i].to]>dfn[x]) opt[e[i].id]=true;
  14. }
  15. }
  16. }

【学习整理】Tarjan:强连通分量+割点+割边的更多相关文章

  1. 小结:双连通分量 & 强连通分量 & 割点 & 割边

    概要: 各种dfs时间戳..全是tarjan(或加上他的小伙伴)无限膜拜tarjan orzzzzzzzzz 技巧及注意: 强连通分量是有向图,双连通分量是无向图. 强连通分量找环时的决策和双连通的决 ...

  2. Tarjan 强连通分量 及 双联通分量(求割点,割边)

    Tarjan 强连通分量 及 双联通分量(求割点,割边) 众所周知,Tarjan的三大算法分别为 (1)         有向图的强联通分量 (2)         无向图的双联通分量(求割点,桥) ...

  3. tarjan 强连通分量

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

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

    友好城市 [问题描述]小 w 生活在美丽的 Z 国. Z 国是一个有 n 个城市的大国, 城市之间有 m 条单向公路(连接城市 i. j 的公路只能从 i 连到 j). 城市 i. j 是友好城市当且 ...

  5. 1051: [HAOI2006]受欢迎的牛 (tarjan强连通分量+缩点)

    题目大意:CodeVs2822的简单版本 传送门 $Tarjan$强连通分量+缩点,若连通块的个数等于一则输出n:若缩点后图中出度为0的点个数为1,输出对应连通块内的点数:否则输出0: 代码中注释部分 ...

  6. tarjan算法(割点/割边/点连通分量/边连通分量/强连通分量)

    tarjan算法是在dfs生成一颗dfs树的时候按照访问顺序的先后,为每个结点分配一个时间戳,然后再用low[u]表示结点能访问到的最小时间戳 以上的各种应用都是在此拓展而来的. 割点:如果一个图去掉 ...

  7. Tarjan算法 (强联通分量 割点 割边)

    变量解释: low 指当前节点在同一强连通分量(或环)能回溯到的dfn最小的节点 dfn 指当前节点是第几个被搜到的节点(时间戳) sta 栈 vis 是否在栈中 ans 指强连通分量的数量 top ...

  8. 学习笔记--Tarjan算法之割点与桥

    前言 图论中联通性相关问题往往会牵扯到无向图的割点与桥或是下一篇博客会讲的强连通分量,强有力的\(Tarjan\)算法能在\(O(n)\)的时间找到割点与桥 定义 若您是第一次了解\(Tarjan\) ...

  9. [poj 2553]The Bottom of a Graph[Tarjan强连通分量]

    题意: 求出度为0的强连通分量. 思路: 缩点 具体有两种实现: 1.遍历所有边, 边的两端点不在同一强连通分量的话, 将出发点所在强连通分量出度+1. #include <cstdio> ...

随机推荐

  1. MySQL解决插入emoji表情失败的问题

    普通的字符串或者表情都是占位3个字节,所以utf8足够用了,但是移动端的表情符号占位是4个字节,普通的utf8就不够用了,为了应对无线互联网的机遇和挑战.避免 emoji 表情符号带来的问题.涉及无线 ...

  2. C#判断一个string是否为数字

    案一:Try...Catch(执行效率不高) private bool IsNumberic(string oText) { try { int var1=Convert.ToInt32 (oText ...

  3. 阿里云centos试用

    今天体验了下阿里云的centos,起初用的官方推荐的putty方式来管理,全部使用命令行管理起来还是很别扭的. 后来通过百度了解到winscp,有了这个工具,管理起来就爽很多啦.整个centos的管理 ...

  4. windows 程序设计自学:添加字符串资源

    #include <windows.h> #include "resource.h" LRESULT CALLBACK MyWndProc( HWND hwnd, // ...

  5. C++中文件按行读取和逐词读取 backup

    http://blog.csdn.net/zhangchao3322218/article/details/7930857 #include  <iostream>#include  &l ...

  6. SQLServer创建维护计划失败 错误c001f011

    重新注册dts.dll文件,在运行里输入命令:(x64)regsvr32 "C:\Program Files\Microsoft SQL Server\100\DTS\Binn\dts.dl ...

  7. 客户端cmd打开mysql,执行插入中文报错或插入中文乱码解决方案

    最近在制作一个安装包,需要安装的时候执行mysql脚本儿,做了一个批处理,但是发现总是执行到 插入中文的时候报错,或者插入中文是乱码. 网上查了好多资料,说是把编码改成GBK什么的,终究还是不成功. ...

  8. Go语言获取项目当前路径

    package main import ( "fmt" "os" "os/exec" "strings" ) func ...

  9. ps图像渐变

    整理自:http://zhidao.baidu.com/question/16374167.html 1.用ps打开图片 2.在切换至英文输入法状态下(下面的操作均如此)按q 快捷键q的作用是切换标准 ...

  10. Haskell 与范畴论

    说到 Haskell,这真是一门逼格极高的编程语言,一般初学者如果没有相关函数式编程的经验,入门直接接触那些稀奇古怪的概念,简直要跪下.现在回想起来,隐隐觉得初学者所拥有的命令式编程语言(impera ...