最小生成樹 模板

2022-06-06 03:21:09 字數 2017 閱讀 4370

板子:

1

intv, e;

2int

p[maxn];

3int

r[maxn];45

void init(int

n) 9}10

11int find(int x)

1213

bool same(int x, int y)

1415

void unite(int x, int

y) else25}

2627

struct

edge edge[maxm];

30bool cmp(const edge& e1, const edge& e2)

31int

kruskal() 41}

42return

res;

43 }

題意:n個城堡,m個橋,每個橋的權值都不一樣,題目要求能使城堡彼此聯通的所有橋集合裡面權值最小的那種,由此可以判斷這是一道求最小生成樹的題。

1 #include2 #include3

using

namespace

std;

4 typedef long

long

ll;5

6const

int maxn = 2000 + 5, maxm = 2e5 + 5;7

struct

edge myedge[maxm];

10int

p[maxn], n, m;

1112

bool cmp(const edge&p1,const edge&p2)

1516

int find(int

x) 19

20int

main() 32}

33if (k != 0

) 37 sort(myedge, myedge +k, cmp);

38int x, y, counter = 0

;39 ll value, sum = 0;40

for (int i = 0; i < k; i++) 50}

51 printf("

yes\n%lld\n

", sum);52}

53else printf("no"

);54

return0;

55 }

poj3723

題意:有 n 個男人 m 個女人,給出若干男女之間的 1~9999 之間的親密度關係,徵募某個人的費用是 10000 -(已經徵募到的人中和自己的親密度的最大值)。要求通過適當的徵募順序使得所有人的所需費用最小

解法:把人與人看做點,則這個問題就轉換為無向圖中的最大權森林問題。將最小生成樹中的邊權去反即可用最小生成樹的演算法求解。

1

intn, m, r;

2int

p[maxn];

3int

r[maxn];45

void init(int

n) 9}10

11int find(int x)

1213

bool same(int x, int y)

1415

void unite(int x, int

y) else25}

2627

struct

edge edge[maxm];

3031

bool cmp(const edge& e1, const edge& e2)

3233

ll kruskal() 43}

44return

res;45}

4647

intmain()

59 printf("

%lld\n

", 10000 * 1ll * (n + m) +kruskal());60}

61return0;

62 }

最小生成樹模板

prim演算法理解可以參考部落格 prim演算法模板 int prime int v int i,j,sum 0,min,k sum是權重和 for i 1 i n i lowcost i 表明當前狀態下在u內距離v點 s中各點 距離的最小值,每個u中點s 中點 都計算 lowcost i map ...

最小生成樹 模板

const int maxn 1010 const int maxm 200020 struct edge edges maxm int father maxn int find int x int cmp edge a,edge b 將邊按權值排序 int kruskal int n,int m ...

模板 最小生成樹

題目描述 如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz 輸入輸出格式 輸入格式 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi 輸出格式 輸出...