在图论中,割点与割边是图的重要性质,它们在图的连通性、网络流等问题中扮演着关键角色。在C++中,我们可以通过深度优先搜索(DFS)等算法来判定一个图中的割点与割边。
割点,又称关节点或桥接点,是指在无向连通图中,如果删除某个顶点后,图的连通分量数增加,则称该顶点为割点。
判定割点的一个常用方法是Tarjan算法。该算法在深度优先搜索的过程中,维护了一个时间戳和一个低值(low)数组。时间戳记录了节点被访问的顺序,而low数组则记录了节点及其子树中能够回溯到的最早访问时间。
在DFS过程中,对于当前节点u,我们遍历其所有邻接节点v。若v是u的一个未被访问过的邻接节点,我们继续递归访问v,并更新u的low值为min(low[u], low[v])。若v是u的一个已访问过的邻接节点,并且v不是u的父节点(避免回溯到父节点造成的错误更新),我们也更新u的low值为min(low[u], dfn[v]),其中dfn数组存储的是节点的访问时间戳。
若对于节点u,存在至少一个邻接节点v,使得low[v] >= dfn[u],则说明从v及其子树中无法回溯到u的父节点或更早的节点,因此u是一个割点。
示例为寻找割点,代码如下。
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 1005; // 假设最大节点数为1000
vector<int> adj[MAX