模板 強連通縮點

2022-05-07 21:27:13 字數 2337 閱讀 9862

直接給他縮點然後求新的圖的完整版:

c2[u]表示縮點後的u點這個環上的點實際上是哪些

g3[u]表示縮點後的u點的出邊

還是一樣,要記得先處理入鏈。(可以讓這個圖好看一點但是沒啥鳥用)入鏈可能會有一些特別的性質,當然假如入鏈沒有特別性質也可以直接縮點。

不對其實直接縮點就可以了,入鏈還是新圖的入鏈,環是他自己,題目給的環內性質就直接搬過來就可以了。

所以可以直接kosaraju。

這裡就是縮點之後出度為0的點的數量只有1的話,就是那個出度為0的點代表的環。

下面這個有點bug,重邊沒插進來,但是卻計算了出度。

#includeusing namespace std;

typedef long long ll;

const int maxn = 105;

const int inf = 0x3f3f3f3f;

int n, w[maxn], indeg[maxn];

vectorg[maxn], g2[maxn];

//從i點出發的連通分量,染色為c1[i]

int c1[maxn], cntc1;

//i點所在的強連通分量,染色為c2[i]

int c2[maxn], cntc2;

//第i個強連通分量內的點

vectorc2[maxn];

int s[maxn], cnts;

void dfs1(int u)

void dfs2(int u)

void kosaraju()

for (int i = n; i >= 1; --i)

if (!c2[s[i]])

}setg3[maxn];

int outdeg3[maxn];

int main()

for (int i = 1; i <= n; ++i)

if (!c1[i] && indeg[i] == 0)

kosaraju();

for(int u = 1; u <= cntc2; ++u) }}

}int out0 = 0, sum = 0;

for(int u = 1; u <= cntc2; ++u)

}printf("%d\n", (out0 == 1) ? sum : 0);

return 0;

}

要記得新圖里加入的u是縮點後的u,v也是!

#includeusing namespace std;

typedef long long ll;

const int maxn = 10005;

const int inf = 0x3f3f3f3f;

int n, w[maxn];

vectorg[maxn], g2[maxn];

//從i點出發的連通分量,染色為c1[i]

int c1[maxn], cntc1;

//i點所在的強連通分量,染色為c2[i]

int c2[maxn], cntc2;

int dp[maxn];

//第i個強連通分量內的點

vectorc2[maxn];

int s[maxn], cnts;

void dfs1(int u)

void dfs2(int u)

void kosaraju()

for (int i = n; i >= 1; --i)

if (!c2[s[i]])

}setgt3[maxn], g3[maxn];

int outdeg3[maxn];

int main()

for(int i = 1; i <= m; ++i)

kosaraju();

/*for(int i = 1; i <= n; ++i) */

for(int u = 1; u <= cntc2; ++u) }}

}queueq;

for(int i = 1; i <= cntc2; ++i)

if(outdeg3[i] == 0)

q.push(i);

int ans = 0;

while(!q.empty())

int maxv = 0;

for(auto v : g3[u])

maxv = max(maxv, dp[v]);

dp[u] += maxv;

ans = max(ans, dp[u]);

}printf("%d\n", ans);

return 0;

}

hdu 2767 強連通縮點

補最少的邊成強連通圖。縮點後成dag,max即為所求。include include include define mn 20020 define me 200010 define mm a,b as void add e int i,int u,int v void tarjan int i el...

hdu 4635 強連通縮點

多校聯賽4的一道題,給乙個有向圖,問最多加多少條邊後仍然不是強聯通,以前總會遇到問最少加幾條邊讓圖成乙個強連通圖,比賽時自己就找到了答案,當時想著新增最多的邊後一定是將原來的圖連成兩個強連通分量,而兩個強連通分量間的邊最多是兩個聯通分量的點數之積,再加上每個聯通分量內部的點的邊數就是所有的邊數,再減...

poj 2553強連通 縮點

先吐槽下,剛開始沒看懂題,以為只能是乙個連通圖0t0 題意 給你乙個有向圖,求g圖中從v可達的所有點w,也都可以達到v,這樣的v稱為sink.求這樣的v.解 求強連通 縮點。求所有出度為0的點即為要求的點。注意 可能有多個聯通分支。include include include define n 5...