图的强连通性:Korasaju算法实现

有向图的强连通性 & Kosaraju算法(求有向图的强连通分量) 浅谈无向图的连通性 连通图是无向图的一个概念: 在无向图中,若从顶点 v1v_1v1​ 到顶点 v2v_2v2​ 有路径,则称顶点 v1v_1v1​ 与 v2v_2v2​ 是连通的; 如果图中任意一对顶点都是连通的,则称此无向图是连通图。 对于一个非连通图,可以通过深度优先搜索或广度优先搜索来获取它的连通分量:从一个未访问过的节点开始进行深度优先或者广度优先搜索,其能到达的所有顶点及其相关的边构成的子图就是一个连通分量;直到访问完全部的节点,便可以获取该图的所有连通分量。 有向图强连通性的概念 在有向图 阅读详情

强连通性:如果有向图中的任意两顶点互相可到达,则该图是强连通的。


有向图强连通性的概念和性质:

1.称有向图G =(V , E) 顶点v  ,w∈V是等价的, 要么v = w; 要么从 v 到 w 有一条有向路 ,并且从 w 到 v 也有一条有向路
2.设 Ei(1≤i≤r) 是头、 尾均在Vi 中的边集, 则Gi =(Vi, Ei ) 称为 G的一个强连通分量, 简称强分量、强支。
3.对于有向图, 在其每一个强连通分量中, 任何两个顶点都是可达的。 vG,与v可相互到达的所有顶点就是包含v的强连通分量的所有顶点
4.设从v可到达(以v为起点的所有有向路径的终点)的顶点集合为T1(G),而到达v(以v为终点的所有有向路径的起点)的顶点集合为T2(G),则包含v的强连通分量的顶点集合是:T1(G)∩T2(G) 
5.性质定理:
一个有向图是强连通的。当且仅当G中有一个回路。他至少包含每个顶点各一次。


求有向图强连通分支的算法—Korasaju算法
输入:有向图G
输出:有向图的强连通分量(森林的孩子-兄弟表示)


算法步骤:
1.深度优先遍历G(起点如何选择无所谓),并计算出每个顶点U的结束时间dfn[u];
2.深度优先遍历G的转置(反向)图GT,选择遍历起点时,按照顶点结束时间从大到小进行。遍历过程中,一边遍历,一边给顶点做分类标记,每找到一个新的起点,分类标记就加1;
3.第二步中产生的标记值相同的顶点构成深度优先森林中的一棵树,也即一个强连通分量







求有向图强连通分支的Korasaju算法实现
/* 按弧的正向搜索, 起点如何选择无所谓 */
int in_order[MAX_VEX] ;
void DFS(OLGraph *G int v) 
{ 	ArcNode *p ;
	Count=0 ;
	visited[v]=TRUE ;
	for (p=G->xlist[v] .firstout ; p!=NULL ; p=p .firstout ; p!=NULL ; p=p->tlink)
	if (!visited[p->headvex])
		DFS(G p , p->headvex) ;
	in_order[count++]=v ;
}


/* 对图G按弧的逆向进行搜索 */
void Rev_DFS(OLGraph *G , int v)
{ 	ArcNode *p ;
	visited[v]=TRUE ;
	printf(“%d” , v) ; /* 输出顶点 */
	for (p=G->xlist[v].firstin ; p!=NULL ; p=p->hlink)
		if (!visited[p->tailvex])
			Rev_DFS(G , p->tailvex) ;
}


void Strongly_Connected_ Component(OLGraph *G)
{ 	int k=1, v, j ;
	for (v=0; v<G->vexnum; v++) visited[v]=FALSE ;
	for (v=0; v<G->vexnum; v++) /* 对图G正向遍历 */
		if (!visited[v]) DFS(G, v) ;
	for (v=0; v<G->vexnum; v++)visited[v]=FALSE ;
	for (j=G->vexnum-1; j>=0; j--) { /* 对图G逆向遍历 */
	v=in_order[j] ;
	if (!visited[v]) {
	printf(“\n第%d个连通分量顶点:”, k++) ;
	Rev_DFS(G, v) ;
		}


	}
}




Korasaju算法复杂度分析:

跟深度优先搜索的复杂度相同:O(|V|+|E|)。
其他求有向图强连通性的算法:
Tarjan算法(与关节点算法似)
Gabow算法。
【算法概论】3.图的分解 Algorithms 作 者:(美)Sanjoy Dasgupta,(美)Christos Papadimitriou,(美)Umesh Vazirani; 本书系统全面地介绍了算法的基本知识。这些知识和技巧既是高等院 校“算法与数据结构”课程的主要内容,也是计算机科学蓬勃发展的理论 基础。 本书涵盖了绝大多数算法设计中的常用技术。在表达每一种技术时, 阐述它的应用背景,强调每个算法运转背后的简洁数学思想。 阅读详情

相关推荐

【图论】Kosaraju算法详解

讲 Kosaraju 算法之前要先知道什么是强连通分量(SCC) 强连通分量 对于一个有向图顶点的子集 S ,如果在 S 内取两个顶点 u 和 v ,都能找到一条从 u 到 v 的路径,那么就称 S 是强连通的。 如果在强连通的顶点集合 S 中加入其他任意顶点集合后,它都不再是强连通的,那么就称 S 是原图的一个强连通分量(SCC:strongly connected componen...

360°顺滑 7182

强连通分量(Korasaju & Tarjan)学习笔记

好久以前学过的东西...现在已经全忘了 很多图论问题需要用到强连通分量,还是很有必要重新学一遍的 强连通分量(Strongly Connected Component / SCC) 指在一个有向图中,存在的一个顶点集合S,对于所有顶点vi∈S,都保证能够互相到达 环就是最简单的强连通分量之一 但是强连通不等价于简单的环,还有可能是环套环、环套环套环...没有高效的算法很难解决这类问题...

weixin_30401605的博客 387

强连通分量总结

1主要写两个算法 1.1强连通分量之Korasaju 这个算法主要依赖的是图G与图G的转置强连通分量是一样的。 具体证明先不考虑了(既是强连通分量,正向可以到达,反向一定也可以到达)。 实现过程 1.    dfs原图G,并且记录结束时间(后序)。后序越大,为相对的根节点。(先这样理解) 2.    给后序节点从大到小排序。 3.    依次取后序大的节点在G的转置图上进行dfs,跳

野生的TFgirl 3435

强连通分量

摘要 强连通分量常用于缩点,是图论中一个重要的知识点。本文首先介绍了强连通分量的相关定义以及其应用范围,然后将着重介绍两种求强连通分量的算法:Kosaraju算法以及Tarjan算法,它们的时间复杂度都是O(n+m)(n:顶点数,m:边数)。 其中Kosaraju算法思想简单,操作方便,易于理解与代码实现,但是性能以及拓展性上比Tarjan略逊一筹;本文将会逐一介绍这两种算法的思想以及实现步骤,最...

帅比王的博客 8990

有向图的强连通分量: Kosaraju算法和Tarjan算法详解

本文介绍强连通分量问题的解法, 主要介绍Kosaraju和Tarjan算法.

一些C++相关的技术笔记或者教程. 1909

GPU微架构演进分析--从SIMT到Scalar-Vector-Tensor计算的混合配比与调度

GPU架构经历了从专用计算模块到统一可编程处理器的演进。传统GPU面临专用电路配比难题,Nvidia Tesla架构通过引入可编程多线程处理器实现图形与计算的统一。Fermi架构进一步向计算倾斜,随后的架构陆续加入Tensor Core等专用单元。AI时代促成了从图形处理主导向AI计算的转变,形成了Scalar+Vector+Tensor的混合计算范式。SIMT调度重要性降低,CUDA面临新挑战,RISC-V等架构可能带来新机遇。

ChipCamp的博客---https://chipcamp.blog.youkuaiyun.com/ 915

图的连通性与连通分量——有向图的强连通分量SCC,缩点及无向图的双连通分量BCC,桥,衔接点

1.图的连通性与连通分量 无向图中若任意两个顶点都是可达的,则图是连通的 有向图中若任意两个顶点都可以到达,则图是强连通的 图的连通分量是顶点在“从......可达”关系下的等价类。即可以理解为其一个子图,所有的连通分量构成图的一个划分。 对于判断无向图连通性,直接用并查集(Union-and-FindSet)维护或者利用bfs、dfs即可 而有向图的连通性,根据起点选择不同结果不同,在...

Hardict的算法日记 1778

NXP S32K3 Safety软件生态全解析:RTD、SPD、SAF、SCST到底怎么选?

本文深入解析NXP S32K3系列MCU的安全软件生态,详细对比RTD、SPD、SAF和SCST四大组件的功能定位与选型策略。针对不同ASIL等级需求,提供从架构设计到工程实践的完整解决方案,帮助开发者高效实现功能安全认证,优化汽车电子系统的安全性与可靠性。

weixin_42524226的博客 323

图论学习六之Strongly connected components强连通分量

      强连通分量(Strongly connected cmponents) • 在有向图G中,如果任意两个不同的顶点相互可达,则称该有向 图是强连通的。有向图G的极大强连通子图称为G的强连通分支。 • 转置图: 将有向图G中的每一条边反向形成的图称为G的转置GT。• 原图G和GT的强连通分支是一样的。       有向图强连通分支的Tarjan算法 •...

weixin_30768175的博客 866

Windows 2012 SYSVOL复制失败的处理

题外话:晓原理、知架构、查日志是排错的三件法宝今天在DC1上新建并链接了一个组策略对像,在客户端刷新时,却报下面的错误:“处理组策略失败。Windows无法应用组策略对象LDAP….”如下图所示:于是在客户端用\\domain.com访问,发现\\domain.com\SYSVOL\domain.com\policies下面没有上面报错的组策略对象。这是怎么一回事呢,pin...

weixin_33989780的博客 1669

STM32 SAES硬件加密协处理器全模式工程实践指南

AES(高级加密标准)是嵌入式系统中最基础且关键的对称密码算法,其硬件加速实现直接影响安全、性能与功耗平衡。Secure AES Coprocessor(SAES)作为STMicroelectronics在STM32U5等高安全MCU中集成的专用密码协处理器,不仅支持标准ECB/CBC/CTR模式,更原生兼容GCM和CCM等认证加密模式,具备抗侧信道、密钥保护与DMA卸载能力。理解其寄存器状态机(CHMOD/MODE/CPHASE)、NPBLB数据对齐机制及GCM四阶段编程范式,是规避Tag校验失败、IV错

weixin_42311427的博客 76

poj 2186 korasaju算法 popular cow

写了两天终于写出来了。一开始写的时候卡在了邻接表矩阵的dfs上,今天上午看了一下参考,瞬间感觉自己2了,然后就写出来了用korasaju求强连通分量。又开始卡了,琢磨要是有两个初度为零的强连通的分量怎么办呢?然后瞬间又灰了,最后问我旁边的一哥们怎么解决的,这次发现自己连题意都没读懂,额。。感觉收获颇多。 下面是我花费了很长时间对korasaju算法的证明,及以自己的在学习korasaju算法的时

soul11201 1178

编译CycloneDDS和CycloneDDS-CXX踩过的坑——CMake Error at CMakeLists.txt:227 (find_package):

最近编译CycloneDDS和CycloneDDS-CXX踩了两个坑,花了不少时间。做个简单的记录,免得以后又踩到。注意:CycloneDDS-CXX编译依赖CycloneDDS,因此必须先编译CycloneDDS需要严格按照步骤进行,否则要入坑步骤如下,1先编译CycloneDDS以上步骤完成CycloneDDS的编译和安装,生成的bin include lib等位于install目录下面。

usstmiracle的博客 1900

Algorithm第四版算法 C++实现(十七)——kosaraju算法(计算强连通分支量)

强连通图(图指有向图):图中任意两点双向可达 强连通分支:图里与自己内部强连通但与整个图的其他部分不强连通的子图 kosaraju算法通过两次DFS来实现,第一次对有向图D进行搜索,并标记顺序;第二次对有向图D的反图(见有向图的构造revers方法)进行搜索。从构造函数进入dfs函数之后,只要不退出则说明之后遍历的都是连通的。 class kosaraju { private: bool *marked; int *id; int count; void dfs(digraph g, int v)

Charlesix59的博客 729

10X Visium空间转录组学入门:从芯片结构到数据分析全流程解析(附避坑指南)

本文全面解析10X Visium空间转录组学技术,从芯片物理结构、探针化学原理到湿实验全流程操作与避坑指南,并详细介绍了从FASTQ数据到空间可视化的核心分析流程。文章旨在帮助科研人员跨越从理论到实操的鸿沟,掌握从样本准备、文库构建到使用Space Ranger和Seurat进行数据分析与可视化的完整路径,为组织生物学研究提供清晰的实践指引。

weixin_29306011的博客 163

第三篇:NVIDIA cuOpt Python API 详解:LP、QP、MILP 建模与求解,附核心术语名词解释

NVIDIA cuOpt是一款GPU加速的优化求解库,支持LP、QP、MILP和路径优化问题。本文详细介绍了其Python API使用方法,包括核心类Problem的变量定义、约束添加、目标设置和求解配置,并提供了术语解释。cuOpt通过GPU并行计算大幅提升大规模优化问题的求解效率,支持多种求解算法和参数配置,适用于需要高性能计算的优化场景。安装方式包含pip和Docker两种,验证安装后即可快速开始建模求解。

算法工程师 236

迷宫城堡

题目 样例 用最简单的方法Korasaju算法,两次dfs深搜,第一次搜索正向图,第二次搜索它的转制图,如果两次搜索得到的节点数一样,就说明这张图连通! #include <iostream> #include <cstdlib> #include <algorithm> #include <cmath> #include <m...

cf刷题随笔 166

RAG测评实战代码

本文主要介绍了RAG测评实战代码,希望对使用RAG的同学们有所帮助。 文章目录 1. 前言 2. 实战代码 2.1 实战代码一 2.2 实战代码二

herosunly的博客 1万+

kosaraju 和 tarjan算法详解(强连通分量)

定 义  在有向图G中,如果任意两个不同的顶点相互可达,则称该有向图是强连通的。 有向图G的极大强连通子图称为G的强连通分支。  转置图的定义:将有向图G中的每一条边反向形成的图称为G的转置GT 。(注意到原图和GT 的强连通分支是一样的)Korasaju算法 1.深度优先遍历G,算出每个结点u的结束时间f[u],起点如何选择无所谓。 每个结点的结束时间和开始时间是dfs序,开始时...

qq_43842119的博客 1611

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

[ACM] POJ 2186 Popular Cows (强连通分量,Kosaraju算法知识整理)

首先是一些知识整理:来源于网络: 以下转载于:http://blog.sina.com.cn/s/blog_4dff87120100r58c.html   Kosaraju算法是求解有向图强连通分量(strong connectedcomponent)的三个著名算法之一,能在线性时间求解出一个图的强分量。 什么是强连通分量?在这之前先定义一个强连通性(strong connectivi

逆风的方向 更适合飞翔 2925

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

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

强连通分量、割点、桥

一、强连通分量 在有向图G中,如果任意两个不同的顶点相互可达,则该有向图为强连通的;一个有向图G的极大连通子图称为G的强连通分支;将有向图G的每一条边反向形成的图称为G的转置Gt. 1.1 有向图的一些定理 有向无环图中唯一出度为0的点,一定可以由任何点出发到达图中节点的数目为有限多个,而且无环,因此从任何点出发往前走,一定终止于出度为0的点...

weixin_30898109的博客 160

HDU - 5934 - Bomb (强连通缩点)

BombTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2468    Accepted Submission(s): 777Problem DescriptionThere are N bombs needing exploding.Ea...

vloai 315

poj2186 Popular Cows(强连通分量)(korasaju||tarjan模板题)

题目链接:http://poj.org/problem?id=2186 题意很简单,给你一个有向图,问其中有几个点可以由任意点所到达 求强连通分量然后缩点,找到出度为零的强连通分量,如果出度为零的强连通分量大于一个,则答案不存在,否则答案为该强连通分量中点的个数。 先用Korasaju算法做了一遍,这个比较好理解,正着dfs一遍标记结束时间,然后根据结束时间从后到前对反图做一遍dfs求连通块,

IDrandom的专栏 680

C++学习笔记:图论——缩点详解

引言 缩点,哲学的东西,你必须拥有。。。 缩点 个人认为就是把一堆强连通的点( 即强连通分量 ),认作为一个点 强连通分量就是这里面的点可以相互到达(算是个环) 详解 一个有向图如下 可以看出有强连通分量 { 1 , 2 } , { 8 , 4 , 9 } , { 7 } , { 6 } , { 3 } , { 5 } 先走一波Tarjan,求出强连通分量 用一个 c...

qq_44013342的博客 6098

强连通分量(Korasaju、Tarjan)

常见的(我见过的)强连通分量的三种算法有:1. Kosaraju算法(双DFS)2.Tarjan算法 3.Gabow http://acm.hdu.edu.cn/showproblem.php?pid=1269 一.Kosaraju算法 算法的核心实现是,首先DFS一遍,得到一个DFS森林,在此过程中得到所有点的拓扑序列(按结束时间由高到低),之后我们建一个反向图,按反拓扑序(结束时间由

梦醒了 2589
上一篇: 无向图的双连通性
下一篇: 逻辑数据库规范化过程(函数依赖)
idevede
博客等级 码龄12年 146粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值