直接給他縮點然後求新的圖的完整版:
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...