強連通分量模板

2021-10-05 10:18:40 字數 1204 閱讀 2583

知識背景:首先明確強連通分量(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...