求图的所有强连通分量 ---- tarjan算法

图论——强连通分量详解! 强连通分量等概念Tarjan算法的过程与实现就讲这么多,平时练习多注意vector与链式前向星的转换。今宵东方不见日,总有夜尽天明时。加油拜拜~~~(特意标红。。。 阅读详情

 

转自:http://apps.hi.baidu.com/share/detail/15830459

 

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

下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}也分别是两个强连通分量。

 

直接根据定义,用双向遍历取交集的方法求强连通分量,时间复杂度为O(N^2+M)。更好的方法是Kosaraju算法或Tarjan算法,两者的时间复杂度都是O(N+M)。本文介绍的是Tarjan算法。

[Tarjan算法]

Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。

定义DFN(u)为节点u搜索的次序编号(时间戳),Low(u)为u或u的子树能够追溯到的最早的栈中节点的次序号。由定义可以得出,

 

当DFN(u)=Low(u)时,以u为根的搜索子树上所有节点是一个强连通分量。

算法伪代码如下

 

接下来是对算法流程的演示。

从节点1开始DFS,把遍历到的节点加入栈中。搜索到节点u=6时,DFN[6]=LOW[6],找到了一个强连通分量。退栈到u=v为止,{6}为一个强连通分量。

 

返回节点5,发现DFN[5]=LOW[5],退栈后{5}为一个强连通分量。

返回节点3,继续搜索到节点4,把4加入堆栈。发现节点4向节点1有后向边,节点1还在栈中,所以LOW[4]=1。节点6已经出栈,(4,6)是横叉边,返回3,(3,4)为树枝边,所以LOW[3]=LOW[4]=1。

 

继续回到节点1,最后访问节点2。访问边(2,4),4还在栈中,所以LOW[2]=DFN[4]=5。返回1后,发现DFN[1]=LOW[1],把栈中节点全部取出,组成一个连通分量{1,3,4,2}。

至此,算法结束。经过该算法,求出了图中全部的三个强连通分量{1,3,4,2},{5},{6}。

可以发现,运行Tarjan算法的过程中,每个顶点都被访问了一次,且只进出了一次堆栈,每条边也只被访问了一次,所以该算法的时间复杂度为O(N+M)。

求有向图的强连通分量还有一个强有力的算法,为Kosaraju算法。Kosaraju是基于对有向图及其逆图两次DFS的方法,其时间复杂度也是O(N+M)。与Trajan算法相比,Kosaraju算法可能会稍微更直观一些。但是Tarjan只用对原图进行一次DFS,不用建立逆图,更简洁。在实际的测试中,Tarjan算法的运行效率也比Kosaraju算法高30%左右。此外,该Tarjan算法与求无向图的双连通分量(割点、桥)的Tarjan算法也有着很深的联系。学习该Tarjan算法,也有助于深入理解求双连通分量的Tarjan算法,两者可以类比、组合理解。

求有向图的强连通分量的Tarjan算法是以其发明者Robert Tarjan命名的。Robert Tarjan还发明了求双连通分量的Tarjan算法,以及求最近公共祖先的离线Tarjan算法,在此对Tarjan表示崇高的敬意。

附:tarjan算法的C++程序

 

 

强连通分量(SCC, Strongly Connected Components) 强连通分量及其Tarjan算法 阅读详情

相关推荐

Tarjan算法详解(包含人工栈写法)

一、Tarjan算法简介 Tarjan算法是由Robert Tarjan发明的一种基于DFS的图论算法,他可以用来求解有向图的强联通 分量或者求解无向图的中的割点和桥等,可以说是图论算法中的基本算法之一。本文将以求解有向 图的强联通分量来介绍Tarjan算法。 二、有向图的强联通 有向图的两个结点可以相互到达,他们便在一个强联通分量内,如图所示: 其中{1,2,3,5}四个结点可以相互到达,...

weixin_42137657的博客 1915

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

有向图强连通分量]在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}也分别是两

乐吾天 1487

SpringBoot SSE避坑指南:当客户端突然断开时服务端SseEmitter的正确回收姿势

本文深入探讨了SpringBoot中SSE连接的生命周期管理,特别是客户端主动断开连接时服务端SseEmitter的正确回收机制。文章重点分析了客户端调用eventSource.cancel()等场景下,如何利用onCompletion()回调进行可靠的资源清理,避免内存泄漏,并提供了防御式编程策略和实战优化建议。

mm9012的博客 777

Tarjan算法详解

Tarjan算法的用途 1.求桥和割点 2.求点和边的双连通分量 3.求强连通 Targan算法的流程 利用dfs来遍历图来构建一种数型的结构 Tarjan算法的两个核心数组 dfn:我们用dfn数组记录 low:我们用low[i]表示一个节点的子树中可以到达最小的dfn (显然对于一个刚刚遍历到的点我们给他赋上一个新的dfn,low)<1>对于第一种用途 Tarjan算法原理

倘若天下着雨。。。你还在 1022

基于Web的智能家居(源码+开题)

实践上,智能家居系统的普及和应用将极大改善人们的居住体验,提高生活质量,同时也有助于促进智能家居产业链的发展和完善,为社会经济发展注入新的活力。此外,本研究还将对基于Web的智能家居系统的用户体验进行深入研究,通过用户调研和数据分析,不断优化系统功能和界面设计,提升用户的使用体验和满意度。针对以上问题,本研究将综合运用物联网、云计算、大数据等新一代信息技术,通过系统架构设计、功能模块开发、安全性保障、用户体验优化等多个方面的研究工作,力求为基于Web的智能家居系统的研发和应用提供全面而有效的解决方案。

sryue06的博客 1902

SAP 对接CBS(http方式)

CLEAR:lv_xml_crc32_string. CONCATENATEcrc32_passwordcrc32_keyi_stringINTOlv_xml_crc32_string. CONDENSElv_xml_crc32_string. CALLFUNCTION'SCMS_STRING_TO_XSTRING' EXPORTING text=lv_xml_crc32_string encoding='8400' "GB...

3597

[图解算法]Tarjan算法求图的强连通分量

强连通分量简介   有向图强连通分量:在有向图G中,如果两个顶点Vi,VjV_i, V_jVi​,Vj​ 间有一条从ViV_iVi​到VjV_jVj​的有向路径,同时还有一条从VjV_jVj​到ViV_iVi​的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly con...

飞鱼の博客 957

全景相机APP

以下是一款**全景相机APP**的完整源码,支持全景照片拍摄(多帧拼接)、全景预览、鱼眼矫正、图片保存/分享、360°全景查看等核心功能,基于Android原生Camera2 API(替代过时的Camera API) + OpenCV(图像拼接) + GLSurfaceView(全景预览)实现,适配Android 8.0+设备,可直接编译运行。runOnUiThread(() -> tvFrameCount.setText("已拍摄:" + frameCount + "帧"));// X轴旋转(上下)

寒寒豆豆软件公司的博客 179

tarjan算法求图中环(强连通分量)

tarjan求强连通分量 Tarjan 的 pascal代码

Starlight 1673

西南科技大学数字电子技术实验七(4行串行累加器设计及FPGA实现)FPGA部分

/在k=1时输入1,并在k=0时运算。//在k=1时输入0,并在k=0时运算。//在k=1时输入1,并在k=0时运算。//在k=1时输入0,并在k=0时运算。//在k=1时输入1,并在k=0时运算。//在k=1时输入1,并在k=0时运算。//在k=1时输入0,并在k=0时运算。//在k=1时输入0,并在k=0时运算。三、程序清单(每条语句必须包括注释或在开发窗口注释后截图)四、综合、管脚分配、生成输出文件、下载(所有步骤截图)五、仿真程序清单、波形(波形截图必做,截图!.k(k),//开关。

Welcome To My6n Blog 4330

AI Agent的数据安全与隐私保护措施

AI Agent(人工智能代理)作为一种能够感知环境、做出决策并采取行动的智能实体,在现代社会的各个领域中得到了广泛的应用,如智能客服、自动驾驶、金融风险评估等。随着其应用的不断拓展,AI Agent处理和存储的数据量急剧增加,这些数据包含了大量的个人敏感信息和商业机密。因此,确保AI Agent的数据安全与隐私保护变得至关重要。本文的目的在于全面探讨AI Agent的数据安全与隐私保护措施,涵盖从数据的采集、存储、处理到传输的整个生命周期。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 2864

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

一:tarjan算法详解 ◦思想: ◦ ◦做一遍DFS,用dfn[i]表示编号为i的节点在DFS过程中的访问序号(也可以叫做开始时间)用low[i]表示i节点DFS过程中i的下方节点所能到达的开始时间最早的节点的开始时间。(也就是之后的深搜所能到达的最小开始时间)初始时dfn[i]=low[i] ◦ ◦在DFS过程中会形成一搜索树。在搜索树上越先遍历到的节点,显然dfn的值就越小。 ...

weixin_30326745的博客 122

HarmonyOS应用开发者基础认证

B. 自定义组件:可复用的 UI 单元,可组合其它组件。D. 内置组件:ArkTS中默认内置的基本组件和布局组件,开发者可以直接调用,如Column、Text、Divider、Button等。E. 属性方法:用于组件属性的配置,统一通过属性方法进行设置,如fontSize()、width()、height()、color() 等。在Column和Row容器组件中,justifyContent用于设置子组件在主轴方向上的对齐格式,alignItems用于设置子组件在交叉轴方向上的对齐格式。

牛肉胡辣汤 3813

Tarjan算法模板-求图的强连通分量算法模板C/C++代码实现内有详细注释

#include <bits/stdc++.h> using namespace std; //设置最大节点数 const int maxv = 10005; //邻接表中的节点结构体,next代表后继节点编号 struct node{ int next; node(int _n):next(_n){} }; //DFN数组记录每个节点入栈的时间戳,DFN另一个作用可以...

weixin_41446643的博客 429

基于生存结局(生存分析/COX回归)的中介效应分析

① 建立观察变量OVB和中介变量MVB的回归模型(注意:这里根据mediation包的介绍,需要构建的是probit模型,而不是logist回归模型,网上有很多的代码用的logistic回归,结果自己跑的时候发现报错,我在这里陷了很久;为了方便演示,我们生成了一个协变量(Age)、一个连续型观察变量(liaOVC)、一个二分类观察变量(OVB)、一个连续型中介变量(MVC)、一个二分类中介变量(MVB)以及最后的结局变量(生存时间[time],生存结局[stats])。

m0_61863309的博客 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【Tarjan】强连通分量与SCC缩点

1)强连通:若一张有向图的节点两两互相可达,则称这张图是强连通的。2) 强连通分量:极大图的强连通子图。

ChaoyingL的博客 1044

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Tarjan求强连通分量、缩点、割点、割边

一些概念 连通:在图中,若i、j两点互相有路径可以到达则称这两点是连通的。 连通图:如果图中任意两点都是连通的,那么图被称作连通图。如果此图是有向图,则称为强连通图。 强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected compone

qq_43635212的博客 242

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

强连通分量Tarjan算法

说到以Tarjan命名的算法,我们经常提到的有3个,其中就包括本文所介绍的求强连通分量的Tarjan算法。而提出此算法的普林斯顿大学的Robert E Tarjan教授也是1986年的图灵奖获得者(具体原因请看本博“历届图灵奖得主”一文)。         首先明确几个概念。 强连通图。在一个强连通图中,任意两个点都通过一定路径互相连通。比如图一是一个强连通图,而图二不是。因为没

不可不戒 1349

P1262 间谍网络 (Tarjan 求强连通分量)

Tarjan 求强连通分量,100分

Veggie的博客 1万+

【算法模板】图论:Tarjan算法求强连通分量

Tarjan 算法是一种高效的求有向图中所有强连通分量的方法。一个强连通分量(SCC)是一个极大子图,其中任意两个顶点之间都是可达的。

2303_80346267的博客 1322

tarjan算法 java_(poj2186)Tarjan算法,求强连通分量

Tarjan算法,求强连通分量深度优先搜索,访问一个节点,给节点赋一个访问顺序的值,给他的low也赋同样的预先值,再用一个堆栈记录它,接着继续访问未访问的节点,如果子节点的low值小于它的,就更新之;如果它能访问的节点在堆栈中,就用那个点的low值更新它。现在,如果访问顺序和他的low值相等,就从堆栈里面pop,知道pop到该节点,并把这些节点归为一类,它们就是一个强连通分图。整个代码很清晰:vo...

weixin_34652580的博客 229

Tarjan 算法的两种用法

uuvvvv。

ysa051030的博客 774

知识点四 图论:Tarjan算法(强连通分量)

Tarjan算法 求解 有向图 强连通分量 的线性时间的算法 一些概念 如果两个顶点可以相互通达,则称两个顶点强连通。 如果有向图G的每两个顶点都强连通,称G是一个强连通图。 有向图的极大强连通子图,称为强连通分量。 极大强联通子图:它是一个图的强连通子图,并且加入任何一个在它的点集外的点都会导致它不再强连通。 Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。 理...

Authur_gyc 516

跟我一起学“仓颉”算法-Tarjan算法

​本章为大家详细的介绍了仓颉数据结构与算法中Tarjan算法的内容。

Cool_foolisher的博客 400

利用 tarjan 算法对有环图进行缩点重建

算法可以找出每个强连通分量,此时,将每个强连通分量打包成一个【大节点】即可,大节点的权重为该强连通分量中所有节点权重之和,最后重新建立一张有向图,图中的节点个数等于强连通分量的个数。很容易求解最大路径之和,但问题是,图中可能会存在环,且题目明确:每个点虽然可以经过多次,但权值最多只能算一次,因此如果存在环,就不能使用。试想一下:如果题目给的有向图中存在环,那能否将【环】抽象成【一个权值更大的点】,这样就可以将图转为 有向无环图,从而利用。允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。

PengFly123的博客 670

Tarjan

强连通分量那些事 tarjan 先定义一下强连通分量,就是在一个图中的一个子集,子集中的每一个点都可以相互到达,并且再加入一个点都不满足这个性质,我们称它二这个图的极大强连通子集,也叫强连通分量。 我们发现,其实一个不在环内的单点,or一个环就可以构成强连通分量,那么我们怎么去求呢,一个叫tarjan的牛人给出了答案,也就是dfs生成树的方式。 首先我们定义low数组是这个点可以到达的点中dfs顺序最小的点,dfn就是dfs的顺序,之后我们每一次dfs的时候都把找到的点放入一个栈s中,最后当low[x]==

yyyyrr的博客 170
上一篇: 宽搜 --- 流星雨题解
下一篇: 上白泽慧音 题解 ---- tarjan求强连通分量
code_beauty
博客等级 码龄16年 25粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值