tarjan演算法的用途
1.求橋和割點
2.求點和邊的雙連通分量
3.求強連通
targan演算法的流程
利用dfs來遍歷圖來構建一種數型的結構
tarjan演算法的兩個核心陣列<1>對於第一種用途
tarjan演算法原理
我們從1開始遍歷,發現6,5,4的low不小於dfn[3],故3為割點(即4,5,6都無法到達3以上的點)
我們發現對於邊(2,5)low[5]大於dfn[2]即5的子樹中的任何點無論如何都無法通過其他方式到2以上的點
於是我們得到了乙個橋。
例題:給出一張連通的無向圖g,求出至少加入多少條邊才能使得圖g是乙個邊雙連通的。
即求邊雙連通分量把度為一的節點數x (x+1)/2即為答案
注意:求邊雙連通分量時low相同的即為同一組
const
int m=10005;
bool
map[m][m],vis[m];
int low[m],dfn[m],cnt[m],num,n,m;
void init()
void dfs(int x,int f)else min(low[x],dfn[i]);
}}int main()dfs(1,0);
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(map[i][j])
if(low[i]!=low[j])//注意:求邊雙連通分量時low相同的即為同一組
cnt[low[j]]++;
for(int i=1;i<=n;i++)
if(cnt[i]==1)ans++;
printf("%d",(ans+1)/2);
return
0;}
例題:
給出乙個無向圖,你可以在一些點設定一些出口,使得刪去任意乙個點之後,其他所有的點都至少與乙個出口連通,求在出口數量最小情況下的放置出口的方案。
即求點雙連通分量中割點的數量
我們可以用dfs雙連通分量求。因為每個割點一定是雙連通分量中重複部分
void tarjan(int
x,int f)}}
}void dfs(intx)}
int main()
for(int i=1;i<=n;i++)
}for(int i=1;i<=n;i++)
}printf("%d
%d",ans1,ans2);
}
tip:ta
rjan
縮點
void tarjan(int x,int f=0)}}
}
tarjan演算法詳解
參考 tarjan演算法在強連通分量分離中運用很廣,書寫簡單,並且可以拓展到圖的割點,割邊上,十分強大 具體思路 令dfn u 表示當前點的時間戳 low u 表示當前點所能到達的點的時間戳中最小的乙個 到達點u時,將其入棧 拓展點u後代 當且僅當dfn u low u 時,棧頂元素全部出棧,此時出...
Tarjan演算法詳解
在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 所以我們在回溯的過程中就能夠通過判...
Tarjan演算法詳解
tarjan是用來解決圖的割邊割點問題以及有向圖的強連通分量 縮點 的問題的。割邊是圖論演算法中一類很常見的問題 在乙個連通圖g中,假設有一條邊e,去掉e後圖g不再連通,那麼e就是g的一條割邊。換句話說,g是連通圖,g e不是連通圖。最暴力最暴力的演算法就是每次都去掉一條邊,然後進行dfs深度優先遍...