图论——连通性

本文详细介绍了图论中的连通性概念,包括割点、点双连通图、点双联通分量、桥、边双连通图、边双联通分量以及强联通图。阐述了判断割点、桥、边双联通分量和强联通分量的方法,并提供了相关算法和代码实现。同时,讨论了有向图中的强联通分量和缩点操作。

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

割点:
1.无向图
2.删去这个点及其所连边后,图不再联通
在这里插入图片描述
点双连通图:
1.无向图
2.没有割点(删去任意一个点图仍联通)
在这里插入图片描述
点双联通分量:
无向图G中所有子图G’
如果G’
1.是点双联通子图
2.不是其他点双联通子图的真子集,
则G’是G的极大点双联通子图,也称点双联通分量。

桥(割边):
1.无向图
2.删此边(不删其连着的点),剩下的图不再联通

在这里插入图片描述

边双连通图:
1.无向图
2.删任意一边,剩下的图仍联通
在这里插入图片描述
边双联通分量:
无向图G中所有子图G’
如果G’
1.是边双联通子图
2.不是其他边双联通子图的真子集,
则G’是G的极大点双联通子图,也称点双联通分量。
注意:
1.一个图可能是边双联通图,却不是点双连通图
2.一个点只可能属于一个边双联通分量,否则这几个边双联通分量还可以合起来成一个更大的边双联通分量
在这里插入图片描述
强联通图:
1.有向图
2.任意两点可以相互到达
所以 必存在环
同理强联通分量
在这里插入图片描述
时间戳:
树上搜索时记录到达每个点的时间(第几次搜索找到的——打完标记就自加)

树边:
一个一个搜索的边(实线)

反向边(返祖边):
某点除了本来的一个一个搜索顺序外,能回到上面的点的边(虚线)
在这里插入图片描述

求割点及点双联通分量:
若u是割点,则u后面的所有数的反向边,都无法回到u的祖先

找到割点,就把后面的数全部割掉,存入
树根是割点,所以要去除这种情况
为了方便,求点双时存的是边
一个点可能在多个点双联通分量里,为防止重复加边
low[u]表示u及其后代最多经过一条反向边能回到的最早的时间戳‘如果
如果dfn(u)<=low(v),u就是割点(数越小,(时间戳)节点越前)
更新low(u):
树边:low(u)=min(low(u),low(v));
反向边:low(u)=min(low(u),dfn(v));

代码:

#include <iostream>
#include <stack>
#include <set>
#include <cstring>
using namespace std;
const int maxm = 1010;  // 最大边数
const int maxn = 110;  // 最大点数
struct edge {
    int u, v;//搜索,从一个点到另一点 
    
### 使用图论算法计算水文学中的连通性问题 在水文学研究中,河流网络可以被建模成图结构来表示水流路径及其相互关系。通过这种模型,能够有效地评估不同节点之间的连通性和流量传输特性。 对于非连通图的情况,在 Wasserman 和 Faust 提出的方法中,针对包含多个独立子图的情形定义了一种特殊的紧密度中心性指标[^1]。这种方法特别适用于描述由若干分离区域组成的复杂流域系统内部各部分间的相对重要程度以及它们如何影响整体流动模式。 当涉及到具体求解最大流等问题时,则可采用基于增广路的最大流算法变体来进行处理。这类方法不仅限于解决标准意义上的二分图匹配任务,同样能很好地适应于模拟降水径流过程中的资源分配情景——即水源从上游向下游逐级传递直至汇入海洋或其他终端接收体的过程[^2]。 此外,考虑到实际地理环境中可能存在循环回路(例如湖泊与支流之间形成的局部闭环),则需运用深度优先搜索(DFS)技术识别并标记这些强联通分支。根据已知理论可知,任何属于同一强联通组件内的顶点必然存在于以首次发现它的起点作为根节点构建出来的子树之内;反之亦然。因此,借助这一性质可以在遍历过程中动态调整当前考察范围从而避免重复劳动或遗漏关键要素[^4]。 最后值得注意的是,在设计具体的实施方案之前应当充分考虑目标场景的特点以便选取最合适的工具集组合起来共同发挥作用。比如,如果希望加快执行速度的话就可以适当增加对边权重属性的关注力度进而优化整个流程效率[^3]。 ```python from collections import defaultdict, deque def bfs(graph, start_node): visited = set() queue = deque([start_node]) while queue: node = queue.popleft() if node not in visited: visited.add(node) for neighbor in graph[node]: if neighbor not in visited: queue.append(neighbor) # 构造简单的无向图示例 graph_example = { 'A': ['B', 'C'], 'B': ['A', 'D'], 'C': ['A', 'E'], 'D': ['B'], 'E': ['C'] } bfs(graph_example, 'A') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值