poj3723 kruskal最小生成樹

2021-09-12 07:00:14 字數 1425 閱讀 2527

最小生成樹。

樹的話就有從葉子到根節點,那麼一棵樹下來,不會有重邊和圈,切,上面的給下面乙個提供關係,這樣生成的樹一定能夠滿足題目要求。

題目求的是最小代價,但題目給的代價是d,要稍微轉化一下。

我用的kruskal演算法。其實也可以用prim演算法,不過我總覺prim難寫一些

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define up(i,a,b) for(int i=a;i#define dw(i,a,b) for(int i=a;i>b;i--)

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

#define dwd(i,a,b) for(int i=a;i>=b;i--)

//#define local

typedef

long

long ll;

const

double esp =

1e-6

;const

double pi =

acos(-

1.0)

;const

long

long inf =

0x3f3f3f3f

;using

namespace std;

typedef pair<

int,

int> pir;

struct edge

;edge grp[

50002];

int sum =0;

int pr[

20005];

int ht[

20002];

int t, n, m, r;

bool

cmp(edge a, edge b)

void

init()

}int

find

(int x)

void

unio

(int x,

int y)

}bool

same

(int x,

int y)

intkruskal()

return cost;

}int

main()

sum =

(10000)*

(n + m)

; sum +

=kruskal()

; cout << sum << endl;

}return0;

}

POJ 3723 解題報告

這道題是最小生成樹問題。由於 收集 每個人只能用一次 關係 所以利用的關係不能形成環。貪心從最小的關係開始,只要不能形成環就收集。這就是kruskal用並查集的演算法。最後沒收集的人每人按最大代價加入總代價就可以了。thestoryofsnow 3723 accepted 908k 344ms c ...

POJ 3723 最大生成樹

天啦嚕t t。稍微的分析看得出這個招募順序是乙個森林,然後想不到是最大生成樹。很裸。每乙個關係就是兩個點加一條邊,構建乙個最大生成樹,每次檢查兩個點是否招募了,不管兩個點是只有乙個沒招募還是兩個都沒招募,都是新增到最大生成樹中去,然後這樣都會節省出d的錢。最後用總錢數減去節省的錢就行了。includ...

poj 3723 最小生成樹

n,m,r。為了不讓男人的編號和女人的編號重複。將女人的編號 n。為了使花的錢最少,要使用最大的關係和。為了轉為最小生成樹,取反。利用優先佇列存貯,prim演算法求最小生成樹。用小頂堆取與已經用過點的集合的最小權的那個點。typedef pairp priority queue,greater qu...