Tarjan演算法求橋和割點

2021-08-04 15:41:28 字數 2235 閱讀 3322

預備定義:

low[u]定義為u或者u的子樹中能夠通過

非父子邊

追溯到的最早的節點的dfs開始時間

d[u]表示dfs過程中u的進棧時間

割點:無向連通圖中,如果刪除某點後,圖變成不連通,則稱該點為割點。

橋:無向連通圖中,如果刪除某邊後,圖變成不連通,則稱該邊為橋。

判斷割點方法:

(1) u為樹根,且u有多於乙個子樹。

(2) u不為樹根,且存在(u,v)為樹枝邊(或稱父子邊,即u為v在搜尋樹中的父親),使得dfn(u)<=low(v)。

也就是u的子樹中的v點無法到達u之前的點,所以u點去掉就是兩個連通分支,所以u為割點

判斷橋的方法:

一條邊(u,v)是橋,當且僅當(u,v)為樹枝邊(即非負邊),且滿足dfn(u)也就是,u的兒子v之間只有一條邊(前提是無重邊),且v點只能到v點到不了v點前,所以(u,v)邊去掉就是兩個連通分支,所以(u,v)為橋

注意

:找橋的時候,要注意看有沒有重邊。有重邊,則不是橋。

例題:poj 1253 spf

#include

#include

#include

#include

using namespace std;

int u,v,case,times,flag,edgenum,col[10005],vet[10005],head[10005],nnext[10005],d[10005],low[10005],cuts[10005];

void init()

void addedge(int u,int v)

int tarjan_cutpoint(int u)

else

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

}return 0;

}int main()

for (int i=1;i<1001;i++)

cout << "network #" << ++case << endl;      

for (int i=1;i<1001;i++)

if  (i==1)

else

if  (cuts[i])

if  (flag)

cout << "  no spf nodes" << endl;

cout << endl;

}cout << endl;

return 0;}

求橋的**(也可以和上面的合併,畢竟判斷條件差不多)

#include

#include

#include

#include

#include

using namespace std;

int n,m,times,bridge,edgenum,head[10005],nnext[10005],cut[10005],vet[10005],low[10005],d[10005],cuts[10005];

void init()

void addedge(int u,int v)

void tarjan(int u,int fa)

if (u!=fa && low[v]>=d[u])

cut[u]=1;

}else if (low[u]>d[v])

low[u]=d[v];

}if (u==fa && son>1)

cut[u]=1;

}int main()

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

if (!d[i])

tarjan(i,i);

vector< pair>  ans;

for(int u=1;u<=n;u++)

for(int e=head[u];e!=-1;e=nnext[e])

if (cuts[e] && vet[e]>u)

ans.push_back(make_pair(u,vet[e]));

sort(ans.begin(),ans.end());

for(int i=0;icout << ans[i].first << " " << ans[i].second << endl;

return 0;

}

Tarjan求割點 橋

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

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...

割點和橋 Tarjan演算法

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