【定义】

对于一个有向图GGG,其连通分量为:对于分量中任意两点u,vu,vu,v,必然可以从uuu走到vvv,且从vvv走到uuu。

强连通分量就是极大连通分量。即一个连通分量加上任何一些点之后它都不是一个连通分量,那么就把它称为强连通分量。

求强连通分量的意义在于能够把任意一个有向图经过缩点之后转化成一个有向无环图(DAG图),缩点是指将所有强连通分量缩成一个点。

【Tarjan算法】

首先我们按DFS序遍历一个图,那么这个图中的所有边可以分为四种:

那么某个点如果在强连通分量中,有以下两种情况:

  1. 存在后向边指向其祖先节点;
  2. 经过某个横叉边先走到了点yyy,然后点yyy存在前向边走到了某个祖先节点。

在Tarjan算法中我们需要引入一个时间戳的概念,我们按照DFS遍历的顺序给每个结点一个编号,假设为1∼N1\sim N1∼N,那么对于后向边(x,y)(x,y)(x,y),yyy的时间戳一定小于xxx,横叉边也是如此。

对于每个点,我们定义两个时间戳:

  • dfn[u]dfn[u]dfn[u]:表示第一次遍历到uuu时的时间戳;
  • low[u]low[u]low[u]:表示从点uuu开始走所能遍历到的最小的时间戳。

那么如果有dfn[u]==low[u]dfn[u]==low[u]dfn[u]==low[u],说明点uuu是其所在的强连通分量的最高点。那么我们就可以把uuu所在的这个强连通分量找出来。

【Tarjan算法代码框架】

void tarjan(int u)
{dfn[u] = low[u] = ++timestamp;//刚遍历到的时候先初始化当前点的时间戳stk.push(u), in_stk[u] = true;//将当前点加到栈中,然后标记这个点在栈中for (int i = h[u]; ~i; i = ne[i])//然后遍历u能到的所有邻点{int j = e[i];if (!dfn[j])//如果当前这个点还没被遍历过{tarjan(j);//遍历一下low[u] = min(low[u], low[j]);//儿子能到的最小时间戳u也能到}else if (in_stk[j])//如果当前这个点还是在栈中low[u] = min(low[u], dfn[j]);//那么就用当前点的时间戳更新一下u的low值}if (dfn[u] == low[u])//如果u为某个强连通分量的最高点{int t;scc_cnt++;//强连通分量的数量do{t = stk.top();stk.pop();in_stk[t] = false;id[t] = scc_cnt;//标记这个点是属于哪个强连通分量} while (t != u);}
}

连通分量、强连通分量与Tarjan算法相关推荐

  1. 有向图强连通分量的Tarjan算法——转自BYVoid

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

  2. [转载] 有向图强连通分量的Tarjan算法 ——byvoid

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

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

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

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

    出处https://www.byvoid.com/zhs/blog/scc-tarjan [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly con ...

  5. 寻找强连通分量的Tarjan算法

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

  6. 算法提高课-图论-有向图的强连通分量-AcWing 367. 学校网络:强连通分量、tarjan算法

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 第一问:通过tarjan算法求出强连通分量并且缩点后,统计入度为0的点的个数p即可. 第二问,至少加几条边才能使图变成强连通分量?这 ...

  7. CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题

    题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...

  8. 图论——强连通分量(Tarjan算法)

    文章目录 强连通分量 利用Tarjan算法求强连通分量 来一道例题练手(USACO08DEC) 图论文章汇总 强连通分量 什么是强连通图? 如果一个有向图中,存在一条回路,所有的结点至少被经过一次,这 ...

  9. 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 强连通图:给定一张有向图.若对于图中任意两个结点x,y,既存在从x到y的路径,也存在从y到x的路径,则称该有向图是"强连通 ...

最新文章

  1. Sublime Text 3 常用插件以及安装方法(转)
  2. ASP.NET 中的正则表达式
  3. python语言中文社区-python中用中文
  4. 【NLP】Transformer自注意机制代码实现
  5. 高阶前端开发人员必备工具-Node.JS知识讲解
  6. 微博客之后有可能是“切客”
  7. php如何设置断点调试,使用 PHPStorm + Xdebug 实现断点调试
  8. AngularJS快速入门指南14:数据验证
  9. Windows Server 2016 AD中新建组织单位、组、用户
  10. 4渲染导出_Civil 3D:导出道路数据的 5 个步骤都在这里了
  11. mysql索引原理及用法
  12. idea2020显示内存占用_【解决讨论】关于macbook pro 16使用 idea2020.1风扇狂转的问题(很吵)...
  13. 能源巨头BP称已经测试了“内部”代币
  14. 利用selenium获取接口数据
  15. python调用多个cpp文件_python 如何调用cpp
  16. 华为平板电池损耗用什么软件测试,平板怎么看电池损耗
  17. C#使用随机数模拟器来模拟世界杯排名(三)
  18. Python中的groupby用法
  19. Java五子棋游戏开发博客
  20. 京东数据中心主要基础设施系统(一)

热门文章

  1. 台式计算机更改bios密码,清除DELL Optiplex等系列台式机BIOS密码
  2. 嵌入式团队培训_数据结构和算法概述
  3. 计算机中丢失vcru,计算机中丢失MSVCR120.dll
  4. Android指纹门锁ESP32项目
  5. RabbitMQ介绍以及五种工作模式
  6. CSS中设置鼠标样式
  7. 如果让你来设计网络,如何让电脑互联?
  8. 电路仿真软件详谈(二十),基于proteus电路仿真软件的步进电机仿真
  9. 国外优秀C/C++网站
  10. 宏与namespace