POJ 3723 解題報告

2021-07-16 09:48:14 字數 1363 閱讀 9331

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

thestoryofsnow

3723

accepted

908k

344ms

c++2132b

/* 

id: thestor1

lang: c++

task: poj3723

*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

const int maxr = 50000;

const int maxn = 10000;

const int maxm = 10000;

void makeset(const int n, int parent, int rank)

}int find(int u, int parent)

return parent[u];

}void union_set(int u, int v, int parent, int rank)

if (rank[ru] < rank[rv])

else if (rank[rv] < rank[ru])

else }

class edge

edge(int u, int v, int w) : u(u), v(v), w(w) {}

bool operator< (const edge &rhs) const

return this->u < rhs.u || (this->u == rhs.u && this->v < rhs.v);

}};int kruskal(int parent, int rank, const int n, edge edges, const int m, int &collected)

} return mst;

}int main()

int collected = 0;

int mst = kruskal(parent, rank, n + m, edges, r, collected);

int minimumpay = mst + (n + m - collected) * 10000;

printf("%d\n", minimumpay);

} return 0;

}

POJ 3723 最大生成樹

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

poj 3723 最小生成樹

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

poj3723 招兵 最大權森林

這是 程式設計挑戰 的一道例題,證明網上大神很多都做了,我就簡單說一下易錯點吧。第一點,這個人是從0開始查的,所以並查集初始化別忘了0.第二點,這道題的克魯斯卡爾要把所有的邊都遍歷一遍。因為這個圖不一定是連通圖,所以g v,e 最後的邊數可不一定是v 1,而遍歷所有的邊就能克服這個矛盾。第三點,對於...