POJ-2728 Desert King 最优比例生成树 01分数规划/参数搜索
生活随笔
收集整理的這篇文章主要介紹了
POJ-2728 Desert King 最优比例生成树 01分数规划/参数搜索
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:給定N個(gè)三維平面點(diǎn),每個(gè)點(diǎn)都有一個(gè)高度,每兩個(gè)點(diǎn)之間的需要構(gòu)邊,邊的距離由x,y坐標(biāo)的歐幾里得距離確定,邊的花費(fèi)有點(diǎn)的高度差即z值確定,現(xiàn)在問一個(gè)合理的生成樹中,花費(fèi)比上距離的最小值為多少?
解法:每一條邊對應(yīng)于一個(gè)高度差,設(shè)每條邊的高度差為Hi,距離為Li,則要求找到一組邊集滿足,一如既往的,我們假設(shè)一個(gè)比例R使得有成立,那么對式子變形后有,得到這個(gè)式子后,我們就能夠?qū)⑦厵?quán)進(jìn)行修改,求一個(gè)最小生成樹來判定是否滿足<=0的要求。由于圖是一個(gè)稠密圖,所以kruskal算法超時(shí)了,改成prim后,priority_queue照樣超時(shí),最后改成最普通版的才Ac掉。
代碼如下:
#include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #include <vector> using namespace std;int N, idx; double R; const double INF = 1e12;const double eps = 1e-6; double D[1005][1005]; double H[1005][1005];struct Node {int x, y, z;void read() {scanf("%d %d %d", &x, &y, &z);} }p[1005];inline int sign(double x) {return x < -eps ? -1 : x > eps ? 1 : 0; }double dist(int x1, int y1, int x2, int y2) {return sqrt(1.0*(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); }double dis[1005]; char vis[1005];struct cmp {bool operator () (const int &a, const int &b) {return sign(dis[a] - dis[b]) > 0;} };bool Ac(double R) {double sum = 0;memset(vis, 0, sizeof (vis));fill(dis, dis+N, 1e12);dis[0] = 0;for (int i = 0; i < N; ++i) {double Min = INF;int u;for (int i = 0; i < N; ++i) {if (!vis[i] && sign(Min-dis[i])>0) {u = i, Min = dis[i]; }}vis[u] = 1;sum += dis[u];for (int v = 0; v < N; ++v) {if (vis[v]) continue;double ct = H[u][v]-R*D[u][v];if (sign(dis[v]-ct) > 0) {dis[v] = ct;}}}return sign(sum) <= 0; }double bsearch(double l, double r) {double mid, ret;while (r - l >= eps) {mid = (l + r) / 2.0;if (Ac(mid)) {ret = mid;r = mid - eps;} else {l = mid + eps; }}return ret; }int main() {while (scanf("%d", &N), N) {for (int i = 0; i < N; ++i) {p[i].read();}idx = 0;for (int i = 0; i < N; ++i) {for (int j = 0; j < N; ++j) {H[i][j] = abs(p[i].z - p[j].z);D[i][j] = dist(p[i].x, p[i].y, p[j].x, p[j].y);}}printf("%.3f\n", bsearch(0, 1e7));}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的POJ-2728 Desert King 最优比例生成树 01分数规划/参数搜索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 运维老鸟职场生活交友经验谈
- 下一篇: 服务器机柜如何选型