預備定義:
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...