割點和橋演算法 摘自《演算法藝術與資訊學競賽》

2022-02-11 13:50:53 字數 817 閱讀 3545

最近在做圓桌騎士的問題,在乙個無向圖中求出雙連通分量,判斷各雙連通分量中是否含有奇圈,求出不能構成奇圈的節點的個數。思路大概明確了,但是寫的時候老是出現問題,所以專題又看了一下雙連通分量的演算法,看來看去,還是劉汝佳的最經典,索性直接手打出來,方便以後再看

void dfs(節點編號k,k的父親節點編號father,deep)

}染色c_k=黑色;

}dfs遍歷本身查詢除了連通塊外並沒有多大用途,關鍵是遍歷的同時,可以記下很多有用的資訊。下面來看看哪些是與dfs相關的常用資訊:

無向連通圖的割頂 我們先考慮割頂的性質

 考慮根頂點root。如果頂點x和y同時root的兒子,那麼由此證明x無法通過非root的頂點與y相連,所以當根root有數量》1的兒子時,根是圖的割頂。

 考慮非根頂點,再考慮i的某個兒子節點j。易知:

1. 和j相連的白色節點丟將成為j的子孫。

2. 和j相連的灰色節點都是j的祖先,由j指向i祖先的邊稱為後向邊。

3. 黑色節點不可能與j相連。

如果i和j的子孫都不存在指向i祖先的後向邊,那麼刪除頂點i後,頂點j和i的祖先或者兄弟將無法連通。因此,當且僅當i的某個兒子及兒子的子孫均沒有指向i祖先的後向邊是,i是圖的割頂。

割頂的求法 在dfs框架的基礎上增加ancestor_k和tot值的計算。

ancestor_k記錄和k以及k的子孫相連的輩分最高的祖先,當ancestor_jd_x(注意不是ancestor_y>=d_x),那麼刪除邊(x,y)後,頂點y將與x不連通,所以(x,y)是圖的橋

橋的求法 他也是基於dfs的框架的演算法,bridge_k,i=true表示記錄邊(i,k)為圖的橋

割點和橋演算法 摘自《演算法藝術與資訊學競賽》

最近在做圓桌騎士的問題,在乙個無向圖中求出雙連通分量,判斷各雙連通分量中是否含有奇圈,求出不能構成奇圈的節點的個數。思路大概明確了,但是寫的時候老是出現問題,所以專題又看了一下雙連通分量的演算法,看來看去,還是劉汝佳的最經典,索性直接手打出來,方便以後再看 void dfs 節點編號k,k的父親節點...

割點和橋 Tarjan演算法

使用tarjan演算法求解圖的割點和橋。1 割點 主要的演算法結構就是dfs,乙個點是割點,當且僅當以下兩種情況 1 該節點是根節點,且有兩棵以上的子樹 2 該節點的任一子節點,沒有到該節點祖先的反向邊 就是說如果沒有這個割點,那麼這個子節點和那個祖先之間不連通 void cutpoint tarj...

Tarjan演算法求橋和割點

預備定義 low u 定義為u或者u的子樹中能夠通過 非父子邊 追溯到的最早的節點的dfs開始時間 d u 表示dfs過程中u的進棧時間 割點 無向連通圖中,如果刪除某點後,圖變成不連通,則稱該點為割點。橋 無向連通圖中,如果刪除某邊後,圖變成不連通,則稱該邊為橋。判斷割點方法 1 u為樹根,且u有...