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

2022-05-14 10:54:03 字數 1672 閱讀 5785

題意:

給出n個點和他們之間的一些關係..

問加多少條邊可以使所有的點變成強連通分量..

思路:

根據題意就可以知道有這個推理:

原圖縮點後的有向無環圖..

出度為0的點和入度為0的點中個數少的那些點向個數多的那些點連線..

可以使森林變成強連通分量..

tips:

注意如果縮點後變成乙個點了..

則入度為0和出度為0的點的個數都是1 但是實際上已經是強連通分量..不需要連線了..

所以答案應該是0

code:

view code

1 #include 2 #include 3 #include 4

using

namespace

std;

5const

int inf = 0x1f1f1f1f;6

#define clr(x) memset(x, 0, sizeof(x))

7const

int maxn = 20010;8

9struct

edge

10edge[10000010

];14

inthead[maxn];

15int

tot;

1617

void add(int s, int

u)18

2324

intdfn[maxn], low[maxn];

25int

ins[maxn], sta[maxn], col[maxn];

26int

ti, top, cnt;

27int

n;28

29void tarjan(int

u)30

else

if(ins[k]) 43}

44if(dfn[u] ==low[u]) while(u !=k);52}

5354}55

56void

solve_ta()

5765

66int

ans;

67int

in[maxn], out

[maxn];

68void

solve()

6982}83

}8485int tmpa = 0, tmpb = 0;86

for(i = 1; i <= cnt; ++i)

9091 ans =max(tmpa, tmpb);

92if(cnt == 1) ans = 0;93

}9495int

main()

96110

solve();

111 printf("

%d\n

", ans);

112}

113return0;

114 }

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 2767 強連通縮點

如a能證明b 就建一條有向邊a b。對於乙個能互相證明的乙個集合,必然每個2個點都能相互到達,這樣的乙個集合就是乙個強連通集合。我們可以把他們看成乙個點,剩下的就是乙個dag圖了。如要都能相互到達,每個點必然出度 1,入度 1 所以統計有多少沒有入度的點和多少沒有出度的點,他們中最大的就是需要新增的...

hdu2767 強連通分量

hdu2767 proving equivalences 傳送門題意 給定乙個 n 1 leq n leq 20000 個頂點,m 0 leq m leq 50000 條邊的有向圖,至少新增幾條邊可以使得整個圖變成強連通圖?題解 強連通分量縮點,判斷每個點的出度或者入度是否為零,最終結果為出度為零的...