hdu3367最大偽森林(並查集)

2022-05-20 11:56:27 字數 1504 閱讀 5470

題目要求乙個連通圖的最大偽森林,偽森林是乙個最多有乙個迴路的圖。我們只要用kruskal最大生成樹的策略就可以,給根節點表上記號表明這棵樹有沒有負環。其實也有一些貪心的思想。

**如下:

1 #include2

using

namespace

std;

3 typedef unsigned int

ui;4 typedef long

long

ll;5 typedef unsigned long

long

ull;

6#define pf printf

7#define mem(a,b) memset(a,b,sizeof(a))

8#define prime1 1e9+7

9#define prime2 1e9+9

10#define pi 3.14159265

11#define lson l,mid,rt<<1

12#define rson mid+1,r,rt<<1|1

13#define scand(x) scanf("%llf",&x)

14#define f(i,a,b) for(int i=a;i<=b;i++)

15#define scan(a) scanf("%d",&a)

16#define mp(a,b) make_pair((a),(b))

17#define p pair18

#define dbg(args) cout<<#args<<":"<19

#define inf 0x3f3f3f3f

20const

int maxn=1e6+10;21

intn,m,t;

22 inline int

read()

26while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'

0',ch=getchar();

27return ans*w;28}

29int

f[maxn];

30bool

mark[maxn];

31struct

nodee[maxn];

34int

ans;

35void

init()

3641

bool cmp(node& a,node&b)

4245

int find(int

x)46

50void union(int x,int y,int

w)5161}

62else

6370}71

}72intmain()

7386 sort(e+1,e+m+1

,cmp);

87 f(i,1

,m)88

91 pf("

%d\n

",ans); 92}

93 }

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

感覺題意很扭曲。不是求最大生成樹!給乙個圖,求pseudoforest偽森林,要求每個連通分量最多可以有乙個環。求能構成的最大值。錯誤寫法,求出最大生成樹 最大的邊 正確寫法 在求最大生成樹的思路的基礎上每次判斷一下環的問題 6 7 0 1 9 0 2 6 1 2 8 3 4 5 4 5 5 3 5...

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...