若low[v]>dfn[u],則(u,v)為割邊。但是實際處理時我們並不這樣判斷,因為有的圖上可能有重邊,這樣不好處理。我們記錄每條邊的標號(一條無向邊拆成的兩條有向邊標號相同),記錄每個點的父親到它的邊的標號,如果邊(u,v)是v的父親邊,就不能用dfn[u]更新low[v]。這樣如果遍歷完v的所有子節點後,發現low[v]=dfn[v],說明u的父親邊(u,v)為割邊。
1void tarjan(intx)2
12else
if(p[x]!=edge[i])//
不是父親邊才更新
13 low[x]=min(low[x],dfn[ver[i]]);
14if(p[x]&&low[x]==dfn[x]) f[p[x]]=1;//
是割邊15 }
求橋和割點的模板:
#includeusingnamespace
std;
#include
#include
#include
#define n 201vector
g[n];
intn,m,low[n],dfn[n];
bool
is_cut[n];
intfather[n];
int tim=0
;void
input()
}void tarjan(int i,int
father)
else
if(father!=k)/*
假如k是i的父親的話,那麼這就是無向邊中的重邊,有重邊那麼一定不是橋
*/low[i]=min(low[i],low[k]);
}}void
count()
}if(rootson>1
) is_cut[
1]=true
;
for(int i=1;i<=n;++i)
if(is_cut[i])
printf(
"%d\n
",i);
for(int i=1;i<=n;++i)
}int
main()
參考:poj3177-tarjan求橋/割邊
tarjan演算法--求無向圖的割點和橋
Tarjan求割點 橋
概念 1.橋 是存在於無向圖中的這樣的一條邊,如果去掉這一條邊,那麼整張無向圖會分為兩部分,這樣的一條邊稱為橋無向連通圖中,如果刪除某邊後,圖變成不連通,則稱該邊為橋。2.割點 無向連通圖中,如果刪除某點後,圖變成不連通,則稱該點為割點。割點特點 1 當前節點為樹根的時候,條件是 要有多餘一棵子樹 ...
《學習筆記》 tarjan 求割點(割頂)
go to the problem 割點 在乙個無向圖中,如果有乙個頂點集合,刪除這個頂點集合以及這個集合中所有頂點相關聯的邊以後,圖的連通分量增多,就稱這個點集為割點集合。如果某個割點集合只含有乙個頂點x 也即是乙個割點集合 那麼x稱為乙個割點。割點 給出乙個n個點,m條邊的無向圖,求圖的割點。輸...
tarjan求割點和橋(割邊)
tarjan求割點和橋 例題 割點 重要的地方在 中都有注釋 include define ll long long using namespace std const ll m 2e4 10,maxn 3e6 30 int dfn m low m tot int e m 1 k,p m k2 ve...