hdu 3367 偽森林,not 最大生成樹

2022-07-26 15:09:09 字數 1249 閱讀 8166

感覺題意很扭曲。。。

不是求最大生成樹!給乙個圖,求pseudoforest偽森林,要求每個連通分量最多可以有乙個環。求能構成的最大值。

錯誤寫法,求出最大生成樹+最大的邊

正確寫法:在求最大生成樹的思路的基礎上每次判斷一下環的問題~

6 7

0 1 9

0 2 6

1 2 8

3 4 5

4 5 5

3 5 4

2 4 1

這組資料如果是錯誤的方法就是34,選擇(0,1),(1,2),(0,2),(2,4),(3,4),(4,5)

正確的方法答案是37,選擇(0,1),(1,2),(0,2),(3,4),(3,5),(4,5)

view code

1 #include 2 #include 

3 #include 4 #include 5

using

namespace

std;

6const

int n=10010;7

intn,m;

8int

father[n];

9int

circle[n];

10struct

edgee[10*n];

13int find(int

x)17

return

father[x];18}

19int

cmp(edge e1,edge e2)

22int

kruskal()

33continue;34

}35if(circle[x]&&circle[y]) continue;36

if(circle[x]&&!circle[y])else

41 ans+=e[i].z;

42//

printf("(%d,%d) %d res=%d\n",e[i].x,e[i].y,e[i].z,ans);43}

44return

ans;45}

46int

main()

53for(i=0;i)

56 sort(e,e+m,cmp);

57 printf("

%d\n

",kruskal());58}

59return0;

60 }

hdu3367最大偽森林(並查集)

題目要求乙個連通圖的最大偽森林,偽森林是乙個最多有乙個迴路的圖。我們只要用kruskal最大生成樹的策略就可以,給根節點表上記號表明這棵樹有沒有負環。其實也有一些貪心的思想。如下 1 include2 using namespace std 3 typedef unsigned int ui 4 t...

HDU 3367最大生成樹

不能直接跑最大生成樹,但是還可以存在乙個環,這樣一下就用krusal判環來寫了就是比普通的最大生成樹多了合併判斷。於網路 include include include using namespace std typedef struct nn node node edg 100005 int fa...

hdu 3367 最大生成樹 判環

不能最大生成樹 最大的一條邊,但是為什麼呢?if fx fy 如果兩棵樹上不是都有回環,那麼可以合併,fx掛在fy上,如果其中乙個有環,fy標記為有環 if fx fy circle x circle y 如果兩棵樹上都沒有回環,那麼x和y還能合併,環數變為1 include includeusin...