寫部落格的好處之一就是能方便的找模板
這裡介紹的是tarjan寫法。
維護兩個陣列, dfn, low。對圖進行dfs,dfn表示當前節點的時間戳, low表示以當前節點為子樹中最小的時間戳。
dfs訪問每個節點,並將節點壓入棧中,訪問它的子節點。
子節點在棧中更新節點的low
子節點不在棧中遞迴訪問子節點回溯更新low
判斷乙個連通分量的標誌:dfn[u] = low[u]
#include
#include
#include
#include
#include
#define mem(a, b) memset(a, b, sizeof(a))
using
namespace std;
const
int maxn =
1e5+10;
int dfn[maxn]
, low[maxn]
;int cnt, tot, n, m;
int head[maxn]
;int belong[maxn]
;bool vis[maxn]
;int ans;
stack<
int>st;
struct nodeedge[maxn *2]
;void
init()
void
addedge
(int u,
int v)
void
tarjan
(int u)
else
if(vis[v])}
if(dfn[u]
== low[u])}
}int
main()
for(
int i =
1; i <= n; i++)if
(dfn[i]==0
)tarjan
(i);
cout << ans <<
" ";
if(ans ==1)
cout <<
"yes"
<< endl;
else
cout <<
"no"
<< endl;
}return0;
}
強連通分量 tarjan求強連通分量
雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...
強連通分量
對於有向圖的乙個頂點集,如果從這個頂點集的任何一點出發都可以到達該頂點集的其餘各個頂點,那麼該頂點集稱為該有向圖的乙個強連通分量。有向連通圖的全部頂點組成乙個強連通分量。我們可以利用tarjan演算法求強連通分量。define n 1000 struct edge e 100000 int ec,p...
強連通分量
在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 下圖中,子圖為乙個強連通分量,因為...