// 默认low[u]等于dfn[u]
dfn[u] = low[u] = ++count;
vis[u] = true;
// 遍历与u相邻的所有顶点
for (int v: g[u])
{
// (u, v)为树边
if (!vis[v])
{
// 递增子树数量
children++;
// 设置v的父亲为u
parent[v] = u;
// 继续DFS
dfs(v);
// DFS完毕,low[v]已求出,如果low[v]<low[u]则更新low[u]
low[u] = min(low[u], low[v]);
// 如果是根节点且有两棵以上的子树则是割点
if (parent[u] == -1 && children >= 2)
cout << "Articulation point: " << u << endl;
// 如果不是根节点且low[v]>=dfn[u]则是割点
else if (parent[u] != -1 && low[v] >= dfn[u])
cout << "Articulation point: " << u << endl;
}
// (u, v)为回边,且v不是u的父亲
else if (v != parent[u])
low[u] = min(low[u], dfn[v]);
}
Tarjan割点
最新推荐文章于 2022-12-31 10:26:59 发布