数据结构——强连通分量图算法

  • 数据结构——强连通分量图算法
    • 连通图
      • 顶点的连通性
      • 连通图
    • 连通分量
      • 无向图的连通分量
      • 有向图的强连通分量
    • 强联通分量图算法
      • Kosaraju算法
        • 算法步骤
      • Tarjan算法
        • 算法思路
        • 算法步骤
      • 算法总结

数据结构——强连通分量图算法

连通图

顶点的连通性

在无向图G中,若从顶点vi到顶点vj有路径(当然从vj到vi也一定有路径),则称vi和vj是连通的。

连通图

在无向图G中,若V(G)中任意两个不同的顶点vi和vj都连通(即有路径),则称G为连通图。
在有向图G中,如果两个顶点vi,vj间有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通。如果有向图G的每两个顶点都强连通,称G是一个强连通图。

连通分量

如果从任意顶点都存在一条路径达到任意一个顶点,则称这幅图是连通图。而连通分量指的是一幅图中所有极大连通子图。

无向图的连通分量

无向图的G的极大连通子图称为G的连通分量。任何连通图的连通分量都只有一个,即其本身,非连通的无向图有多个连通分量。
使用广度优先搜索或深度优先搜索来计算线性时间内图的连通分量是很直接的。无论哪种情况,从某个特定顶点v开始的搜索将在返回之前找到包含v(并且不再有)的整个连接组件。要查找图的所有连通分量,循环遍历其顶点,每当循环到达一个尚未包含在先前找到的连通分量中的顶点时,开始新的宽度第一次或深度第一次搜索。

有向图的强连通分量

有向图强连通分量:在有向图G中,如果两个顶点vi,vj间有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量。

强联通分量图算法

Kosaraju算法

算法步骤

(1) 在图G中,计算图G的反向图G’的深度优先搜索的逆后序排列。反向图是比如原图中有vi到vj的链接,那么反向图中就有vj到vi的链接。逆后序排列是指,在对一个图进行深度优先遍历时,先进行子节点的递归,再将本节点加入到一个栈中,最后依次出栈以获得的序列。逆后序排列有一个重要特性,就是如果有vj到vi的有向链接,那么实际出栈时,vj仍然排在vi的前面。
(2) 在G中进行普通的深度优先搜索,但是搜索顺序不是按照正统的顺序( i = 0, i < N )去依次搜索,而是以刚刚获得的逆后序排列的顺序进行搜索。
(3) 每个以这个逆后序排列中的元素开始的DFS搜索,找到的所有元素,都是同一个强联通分量的元素。

Tarjan算法

算法思路

Tarjan算法是基于DFS的,每个强连通分量为搜索树的一棵子树,搜索时把当前搜索树中未处理的节点加入一个栈,回溯时判断栈顶到栈中节点是否为强连通分量。为了使这颗搜索树在遇到强连通分量的节点的时候能顺利进行。在DFS时每个点都需要记录两个数组:
DFN[u]:代表u点DFS到的时间,即时间戳,简单来说就是第几个被搜索到的。可知在同一个DFS树的子树中,DFN[u]越小,则其越浅。
Low[u]:代表在DFS树中,u或u的子树能够追溯到的最早的栈中节点的时间戳。

算法步骤

(1) 数组的初始化:对图进行深度优先搜索,在搜索过程中用 DFN 记录搜索的顺序。当首次搜索到u时,DFN与 Low 数组的值都为 到该点的时间。
(2) 每搜索到一个点,将它压入栈中。如果这个点有邻居顶点就继续往下找,直到该顶点不存在未被访问的邻居顶点。
(3) 每次返回时都将子节点与该节点的Low值进行比较,谁小就取谁,保证最小的子树根。当点u 有与点u’ 相连时,如果此时u’不在栈中,u的Low值为两点的Low值中较小的一个。当点u 有与点u’ 相连时,如果此时u’在栈中,u的Low值为u的Low值和u’的DFN值中较小的一个。
(4) 每当搜索到一个点经过以上操作后(也就是子树已经全部遍历)的Low值等于DFN值(DFN[u] == Low[u]),则将它以及在它之上的元素弹出栈。这些出栈的元素组成一个强连通分量。
(5) 继续搜索,直到所有点被遍历。

算法总结

可以发现,Tarjan算法中,每个顶点都被访问了一次,且只进出了一次堆栈,每条边也只被访问了一次,所以该算法的时间复杂度为O(N+M)。Kosaraju是基于对有向图及其逆图两次DFS的方法,其时间复杂度也是O(N+M)。与Trajan算法相比,Kosaraju算法可能会稍微更直观一些。但是Tarjan只用对原图进行一次DFS,不用建立逆图,更加简洁。

数据结构——强连通分量图算法相关推荐

  1. 有向图最长路径算法_算法数据结构 | 三个步骤完成强连通分量分解的Kosaraju算法...

    强连通分量分解的Kosaraju算法 今天是算法数据结构专题的第35篇文章,我们来聊聊图论当中的强连通分量分解的Tarjan算法. Kosaraju算法一看这个名字很奇怪就可以猜到它也是一个根据人名起 ...

  2. 【数据结构】连通图、连通分量与强连通图、强连通分量—区别在于强,强强在哪里?

    目录 什么是连通图? 什么是连通分量? 那什么是极大连通子图呢?联想到的极小连通子图又是什么呢? 强连通图 强连通分量 "强强"在那里-连通图和强连通图的区别? 创作不易,不妨点赞

  3. 极小连通子图和极大连通子图_强连通分量与拓扑排序

    前言 由于GacUI里面开始多处用上拓扑排序,我决定把之前瞎JB搞出来的算法换掉,换成个正式的.之前我自己弄了个写起来很简单的算法,然后每一处需要用到的地方我就重新做一遍.当然这样肯定也是不行的,我觉 ...

  4. 有向图的强连通分量——Tarjan

    在同一个DFS树中分离不同的强连通分量SCC; 考虑一个强连通分量C,设第一个被发现的点是 x,希望在 x 访问完时立刻输出 C,这样就可以实现 在同一个DFS树中分离不同的强连通分量了. 问题就转换 ...

  5. Kosaraju算法、Tarjan算法分析及证明--强连通分量的线性算法

    一.背景介绍 强连通分量是有向图中的一个子图,在该子图中,所有的节点都可以沿着某条路径访问其他节点.强连通性是一种非常重要的等价抽象,因为它满足 自反性:顶点V和它本身是强连通的 对称性:如果顶点V和 ...

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

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

  7. tarjan算法总结 (强连通分量+缩点+割点),看这一篇就够了~

    文章目录 一.tarjan求强连通分量 1:算法流程 2:模板 二.tarjan缩点 1:相关定义 2:算法流程 三.tarjan求割点.桥 1.什么是割点 2.割点怎么求? 3.割点tarjan模板 ...

  8. Tarjan 算法思想求强连通分量及求割点模板(超详细图解)

    割点定义 在一个无向图中,如果有一个顶点,删除这个顶点及其相关联的边后,图的连通分量增多,就称该点是割点,该点构成的集合就是割点集合.简单来说就是去掉该点后其所在的连通图不再连通,则该点称为割点. 若 ...

  9. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...

    转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...

最新文章

  1. .NetCore Winform控制台 做HTTP Host,简易接口
  2. Cordova+jQuery Mobile+Spring REST
  3. 【推荐】年终已至,十张图告诉你15年领取年终奖的正确姿势
  4. webBrowser强制在本窗口打开,禁止在新窗口打开
  5. EventUtil.addHandler方法
  6. python视频网站分类_媒资分类_Python SDK_服务端SDK_视频点播 - 阿里云
  7. Asp.net五大对象
  8. 【C语言】又是排序(指针专题)
  9. 对比iOS网络组件:AFNetworking VS ASIHTTPRequest
  10. Solidworks常用技巧
  11. URAL 2037 Richness of binary words
  12. STM32F103 用CS1237 /HX711 芯片制作电子秤
  13. ae输出quicktime设置_AE设置渲染输出视频及视频格式技巧教程
  14. 笔记本电脑使用的11个酷炫技巧
  15. python魔法方法指南_2011年最热门的20种方法指南
  16. 深扒:基于UEBA的数据使用安全防护
  17. 英特尔奔腾芯片漏洞_什么是奔腾(英特尔)?
  18. 数字盲打怎么练_如何提高盲打速度?键盘指法练习方法
  19. [牛客网中级项目]第四章用户注册登陆管理
  20. 一文了解数据分析师视角下的数据中台

热门文章

  1. HBase几种安装方式
  2. html table colgroup,HTML的colgroup标签
  3. python commands_python之返回状态commands模块
  4. python与单片机如何进行串行口通信_51单片机的串行口通信方式
  5. 据传苹果新iMac上市推迟至10月有望使用苹果M2处理器
  6. 计算机无法启用媒体流,电脑流媒体打不开怎么回事?电脑打开媒体流的方法
  7. FFmpeg 从零开始开发简单的音视频播放器(四)
  8. 用计算机写词,全民一起来学习 用遗传算法让电脑写宋词
  9. 最“热乎”的蚂蚁Java社招面试经历分享(共40个面试题)
  10. python斐波那契数列for循环_Python编程题、for循环和列表推导式的用法题(阿凡提与国王比赛下棋、 斐波那契数列等)...