這是《程式設計挑戰》的一道例題,證明網上大神很多都做了,我就簡單說一下易錯點吧。
第一點,這個人是從0開始查的,所以並查集初始化別忘了0.
第二點,這道題的克魯斯卡爾要把所有的邊都遍歷一遍。因為這個圖不一定是連通圖,所以g(v,e)最後的邊數可不一定是v-1,而遍歷所有的邊就能克服這個矛盾。
第三點,對於每次對a和b是否在同乙個集合的查詢,一定要再做一次gf(a),gf(b),這樣才能保證如果a,b在同乙個集合,f[a]==f[b],否則可能不等。
下面上**。
15513776
***3723
accepted
840k
469ms
c++1001b
#include
#include
using namespace std;
int n,m,r,t;
struct node
e[51000];
int f[21000];
int gf(int x)
}void un(int x,int y)
void init()
{ scanf("%d %d %d",&n,&m,&r);
int a,b,cost;
for(int i=0;i
祝大家學習愉快,願oi永葆青春
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...