hdu2767 強連通分量

2022-06-08 16:12:06 字數 1408 閱讀 4938

hdu2767 proving equivalences

傳送門題意

給定乙個\(n(1\leq n\leq 20000)\)個頂點,\(m(0\leq m\leq 50000)\)條邊的有向圖,至少新增幾條邊可以使得整個圖變成強連通圖?

題解

強連通分量縮點,判斷每個點的出度或者入度是否為零,最終結果為出度為零的點的個數與入度為零的點的個數的最大值

圖連通時的連邊方式,紅色表示新加入的邊

圖不連通時的連邊方式,紅色表示新加入的邊

ps:如果原圖本身就是強連通圖,需要特判結果為零

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

#define pii pair#define pll pair#define pi acos(-1.0)

#define eps 1e-6

#define lowbit(x) x&(-x)

using namespace std;

const int maxn=20010,maxm=50010;

int t,n,m;

int head[maxn],nxt[maxm],to[maxm],cnt;

int dfn[maxn],low[maxn],scc[maxn],stk[maxn],top,dfscnt,scccnt;

int in[maxn],out[maxn];

void add(int x,int y)

void tarjan(int u)

else if(!scc[v])

}if(dfn[u]==low[u])

}}int main()

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

memset(in,0,sizeof(in));

memset(out,0,sizeof(out));

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

int ans1=0,ans2=0;

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

if(scccnt==1) printf("0\n");

else printf("%d\n",max(ans1,ans2));

}return 0;

}

hdu 2767強連通分量練習

判斷強連通圖之後,果斷要做做強連通分量的題目,之前做求割點的題目的時候就已經學過了tarjan演算法了。但是還是不會用,一開始看到這個題目的時候不知道怎麼辦,感覺就是有種怪怪的感覺。看了網上的 出度和入度的判斷真的還蠻精妙的。通過一邊tarjan演算法已經將乙個圖分解成了很多個前連通圖了。這要計算出...

Hdu 2767 把森林變成強連通分量 cpp

題意 給出n個點和他們之間的一些關係.問加多少條邊可以使所有的點變成強連通分量.思路 根據題意就可以知道有這個推理 原圖縮點後的有向無環圖.出度為0的點和入度為0的點中個數少的那些點向個數多的那些點連線.可以使森林變成強連通分量.tips 注意如果縮點後變成乙個點了.則入度為0和出度為0的點的個數都...

hdu 1269 hdu 2767 強連通分量)

1 include2 include3 include4 const int maxn 10000 10 5 using namespace std 6 vectormp maxn 7 stacks 8int n,m 9int count 10int cnt 11bool mark maxn 12i...