Acme Design is a full service design agency.
Sarah Levin, CEO
這是一張無向圖
0
1
2
3
4
5
6
7
8
將其DFS的過程化為樹後
發現邊可以區分為兩種
0
1
2
3
4
5
6
7
8
樹邊 Tree edge (由父親連到小孩)
回邊 Back edge(由子孫連到祖先)
觀察:
拔掉那些點後會使此圖不連通?
拔掉那些邊後會使此圖不連通?
0
1
2
3
4
5
6
7
8
共通特徵:
其子孫沒有除了經過此點外到達祖先的方法,此點為關節點
特例:
根節點的情況呢?
我們定義
low[v] 為不經過其父節點能抵達的最淺深度
dis[v] 為此節點的深度
low[v] >= depth[v] 時,就是關節點了!
實際跑一次(白板)
void dfs(int v, int par)
{
int child_cnt = 0;
visited[v] = 1;
if (v != par) low[v] = dis[par]+1;
dis[v] = dis[par]+1;
for (int u: adj[v])
{
if (!visited[u])
{
child_cnt++;
dfs(u, v);
low[v] = min(low[v], low[u]);
if (low[u] >= dis[v] && par != -1 )
// v 是割點
}
else if (dis[u] < dis[v] )
low[v] = min(dis[u], low[v]);
}
if (par == -1 && child_cnt > 1)
//v 是割點 (根節點的特判情形)
}0
1
2
3
4
5
6
7
8
共通特徵:
對於點u及其子孫v,若v的子樹中,
不存在回邊到達u或者u的祖先,此條邊為橋