tarjan演算法應用 割點 橋 雙連通分量

2021-07-09 14:50:25 字數 1862 閱讀 1476

tarjan演算法的應用。

還需多練習…….遇上題目還是容易傻住

對於tarjan演算法中使用到的dfn和low陣列.

low[u]:=min(low[u],dfn[v])——(u,v)為後向邊,v不是u的子樹;

low[u]:=min(low[u],low[v])——(u,v)為樹枝邊,v為u的子樹;

1.求割點:

割點:若刪掉某點後,原連通圖**為多個子圖,則稱該點為割點。

原理:若low[v]>=dfn[u],則u為割點。因low[v]>=dfn[u],則說明v通過子孫無法到達u的祖先。那麼對於原圖,去掉u後,必然會分成兩個子圖。

所以處理節點u時,先遞迴v的子節點,然後回溯至u時,如果滿足low[v]>=dfn[u],則u為割點。

int tarjan(int x)

else

low[x]=min(low[x],dfn[ver[i]]);

if((x==1&&v[x]>2)||(x>1&&v[x]>1)) //對第乙個特判

v[x]=2;

else

v[x]=1;

} }

2.求橋

橋(割邊):刪掉它之後,圖必然會**為兩個或兩個以上的子圖。

原理:若low[v]>dfn[u],則(u,v)為橋。由割點同理可得。但是由於可能存在重邊,需要把一條無向邊拆成的兩條標號相同的有向邊,記錄每個點的父親到它的邊的標號,如果邊(u,v)是v的父親邊,就不能用dfn[u]更新low[v]。這樣如果遍歷完v的所有子節點後,發現low[v]=dfn[v],說明u的父親邊(u,v)為割邊。

void tarjan(int x)

else

if(p[x]!=edge[i]) //不是父親邊則更新

low[x]=min(low[x],dfn[ver[i]]);

if(p[x]&&low[x]==dfn[x])

f[p[x]]=1; //為割邊

} }

3.點雙連通分量

點雙連通分支,在求割點的過程中就能把每個點雙連通分支求出。建立乙個棧,儲存雙連通分支。在搜尋圖時,每找到一條樹枝邊或後向邊(非橫叉邊),就把這條邊加入棧中。如果遇到某時滿足dfs(u)<=low(v),說明u是乙個割點,同時把邊從棧頂乙個個取出,直到遇到了邊(u,v),取出的這些邊與其關聯的點,組成乙個點雙連通分支。

if(dfn[u]==low[u])

}}

4.邊雙連通分支。在求出所有的橋以後,把橋邊刪除,原圖變成了多個連通塊,則每個連通塊就是乙個邊雙連通分支。橋不屬於任何乙個邊雙連通分支,其餘的邊和每個頂點都屬於且只屬於乙個邊雙連通分支。

5.乙個有橋的連通圖,如何把它通過加邊變成邊雙連通圖

首先求出所有的橋,然後刪除這些橋邊,剩下的每個連通塊都是乙個雙連通子圖。把每個雙連通子圖收縮為乙個頂點,再把橋邊加回來,最後的這個圖一定是一棵樹,邊連通度為1。

統計出樹中度為1的節點的個數,即為葉節點的個數,記為leaf。則至少在樹上新增(leaf+1)/2條邊,就能使樹達到邊二連通,所以至少新增的邊數就是(leaf+1)/2。

void tarjan(int u,int fa)

else

if(instack[v])

low[u]=min(low[u],dfn[v]);

}if(dfn[u]==low[u])

}}for(i=1;i<=n;i++)

}int sum=0;

for(i=1;i<=n;i++)

if(degree[i]==1)

sum++; 統計leaf數

}

割點和橋 Tarjan演算法

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

Tarjan求割點 橋

概念 1.橋 是存在於無向圖中的這樣的一條邊,如果去掉這一條邊,那麼整張無向圖會分為兩部分,這樣的一條邊稱為橋無向連通圖中,如果刪除某邊後,圖變成不連通,則稱該邊為橋。2.割點 無向連通圖中,如果刪除某點後,圖變成不連通,則稱該點為割點。割點特點 1 當前節點為樹根的時候,條件是 要有多餘一棵子樹 ...

Tarjan演算法求橋和割點

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