C++图论之强连通图

本文介绍了图论中的强连通图概念,并针对有向图的强连通性进行了探讨。通过深度搜索算法,解析了如何在有向图中寻找强连通分量,同时解释了在算法过程中涉及的树边、反祖边、横叉边和前向边等概念。最后,提供了一个C++实现的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 连通性

什么是连通性?

连通,字面而言,类似于自来水管道中的水流,如果水能从某一个地点畅通流到另一个地点,说明两点之间是连通的。也说明水管具有连通性,图中即如此。

无向图和有向图的连通概念稍有差异。

无向图连通性

如果任意两点间存在路径,称此图具有连通性,如下的图结构具有连通性。提及连通性,就不得不说连通分量,通俗而言,指结构中有多少个连通通道,如下的图结构只有一个连通通道,也就是一个连通分量,所有节点在这个连通通道上都能互通。

1.png

而下图,则有2个连通分量。1,2,3,4,5可以在一个连通通道上互通,不能和6,7互通。6,7在自己的连通通道上可以互通。

2.png

如何检查图结构的连通性和计算连通分量?

笨拙的方案自是使用深度或广度搜索算法。原理较简单,一次搜索完毕后,搜索到的节点必是在一个连通分量上。如果一次搜索完毕后被搜索出来的节点数量和图结构原有的节点数量相同,可证明只有一个连通分量。否则,可以再次从除第一次搜索出来的节点之外的节点开始重新搜索,再检查搜索出来的节点数量……如此如此,便可以检测出所有连通分量。

在性能要求不高的应用场景,这是不错的选择。否则,可以使用轻巧、快速的并查集数据结构来检查。

有向图的连通性

无论是在有向图或无向图中,都不可能改变连通这个概念。区别于有向图中的边有方向,无向图中的连通可以认为是双向通道,可认为是广义连通;有向图中的连通则是单向通道,可认为是狭义连通。

有向图中,如果一个节点能通过单向通道到达另一个节点,可认为这两点之间是连通的。如下图中,4->1、2->4->1是连通的,而2-3是不连通的。讨论连通的局部性没有太大意义,有向图中讨论的是强连通性。

3.png

什么强连通?

强连通是有向图的特定概念。有向图中,任意两点之间都可以连通,则认定此有向图为强连通图,如下图。

4.png

连通分量用来记录连通通道的数量,有向图中的连通分量指强连通分量。如上图,有一个强连通分量,也称此图为强连通性有向图。

如下图所示有向图结构,有向图本身不具有强连通性,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚大果壳

码文不易,晚上熬夜需要点咖啡钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值