知識背景:首先明確強連通分量(strongly connected component)的概念,從任一頂點能夠到達任一其他頂點的有向圖 的頂點子集,而任意有向圖均可以分解成若干不相交的scc。把每個scc視作乙個頂點,可得到乙個dag。
實現演算法:兩次dfs,第一次 dfs 遍歷將頂點後序(post order)記錄下來vs(vector),這裡需要注意的是,不管從哪個點dfs,由於是後序記錄,故最終得到的記錄是一樣的,vs中的頂點(按下標)從前至後對應在dag中為從尾到頭。第二次dfs對於vs中的元素從尾到頭進行,使用反向邊,故每次dfs只能訪問到同乙個強連通分量。因而每次dfs時給所到頂點加上乙個表示第幾個scc的標號,即可完成對該圖的分解。
例題:poj2186
每頭羊有若干崇拜物件,並且崇拜關係可傳遞,求出被其他所有羊崇拜的羊的個數。
即求最後乙個scc所含頂點個數。
123
4567
891011
1213
1415
1617
1819
2021
2223
2425
2627
2829
3031
3233
3435
3637
3839
4041
4243
4445
4647
4849
5051
5253
5455
5657
5859
6061
6263
6465
6667
6869
7071
#include#include#includeusing namespace std;
int n,m;
vectorg[10001];
vectorrg[10001];
bool used[10001];
vectorvs;
int cmp[10001];
void dfs(int v)
int main()
int num=scc();
int u,res=0;
for(int i=0; i
強連通分量(模板)
low u min edge maxm 2 int head maxm 2 tot int low maxn dfn maxn belong maxn belong 的值為1 scc int index,top int scc 強連通分量 bool instack maxn int num maxn...
強連通分量 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...