POJ 2728 Desert King(最优比率生成树 01分数规划)

http://poj.org/problem?id=2728

题意:

在这么一个图中求一棵生成树,这棵树的单位长度的花费最小是多少?

思路:

最优比率生成树,也就是01分数规划,二分答案即可,题目很简单,因为这题是稠密图,所以用prim算法会好点。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<stack>
 7 #include<queue>
 8 #include<cmath>
 9 #include<map>
10 #include<set>
11 using namespace std;
12 typedef long long ll;
13 const int INF = 0x3f3f3f3f;
14 const int maxn=1000+5;
15 const double eps=1e-6;
16
17 int n;
18 int x[maxn],y[maxn],z[maxn];
19 bool vis[maxn];
20 double cost[maxn][maxn],dis[maxn][maxn],d[maxn];
21
22
23 double prim(double x)
24 {
25     double sum=0;
26     memset(vis,0,sizeof(vis));
27     vis[1]=1; d[1]=0;
28     for(int i=2;i<=n;i++) d[i]=cost[1][i]-x*dis[1][i];
29     for(int i=2;i<=n;i++)
30     {
31         double MIN=INF;
32         int pos;
33         for(int j=1;j<=n;j++)
34         {
35             if(!vis[j] && d[j]<MIN)
36             {
37                 pos=j;
38                 MIN=d[j];
39             }
40         }
41         vis[pos]=1;
42         sum+=MIN;
43         for(int j=1;j<=n;j++)
44         {
45             if(!vis[j] && d[j]>cost[pos][j]-x*dis[pos][j])
46                 d[j]=cost[pos][j]-x*dis[pos][j];
47         }
48     }
49     return sum;
50 }
51
52 int main()
53 {
54     //freopen("in.txt","r",stdin);
55     while(~scanf("%d",&n) && n)
56     {
57         for(int i=1;i<=n;i++)
58         {
59             scanf("%d%d%d",&x[i],&y[i],&z[i]);
60             for(int j=1;j<i;j++)
61             {
62                 cost[i][j]=cost[j][i]=abs(z[j]-z[i]);
63                 dis[i][j]=dis[j][i]=sqrt((double)(y[i]-y[j])*(y[i]-y[j])+(double)(x[i]-x[j])*(x[i]-x[j]));
64             }
65         }
66         double l=0,r=100000;
67         double ans=0;
68         while(r-l>=eps)
69         {
70             double mid=(l+r)/2.0;
71             if(prim(mid)>=0)
72             {
73                 ans=mid;
74                 l=mid;
75             }
76             else r=mid;
77         }
78         printf("%.3f\n",ans);
79     }
80     return 0;
81 }
时间: 2024-10-08 09:47:59

POJ 2728 Desert King(最优比率生成树 01分数规划)的相关文章

POJ 2728 Desert King (最优比率生成树---01分数规划)

题目地址:POJ 2728 01分数规划的应用之一-最优比率生成树. 跟普通的01分数规划类似,只是这题的验证函数改成了最小生成树来验证.弱用的迭代法. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <map>

poj 2728(Desert King) 最优比例生成树 (分数规划)

这题是最小生成树的一种扩展,就是求一棵树  使得 k =sigma(cost)/ sigma(len)  最小.   其中cost 为每条边花费,len为长度.  这实际上就是一个最优比例生成树.最优比例生成树的求解使用了分数规划的方法.  我们先任取k,假设k是最小值,那么sigma(ccost)-k*sigma(len)==0  .那么我们就新建图边权 为  ccosti-k*leni  .求一次最小生成树,如果生成树权值小于0,那么书名其实k还是有减小的空间的,否则,k不可能是最小.这样我

POJ 2728 Desert King 最优比率生成树

Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 20978   Accepted: 5898 [Description] David the Great has just become the king of a desert country. To win the respect of his people, he decided to build channels all over his co

Desert King (poj 2728 最优比率生成树 0-1分数规划)

Language: Default Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 22113   Accepted: 6187 Description David the Great has just become the king of a desert country. To win the respect of his people, he decided to build channels

POJ 2728 Desert King 最优比例生成树

最优比例生成树,迭代方法..... Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 21086   Accepted: 5916 Description David the Great has just become the king of a desert country. To win the respect of his people, he decided to build channels

ZOJ 2728 Desert King(最优比例生成树)

Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 20586   Accepted: 5777 Description David the Great has just become the king of a desert country. To win the respect of his people, he decided to build channels all over his coun

POJ2728 最小比率生成树/0-1分数规划/二分/迭代(迭代不会)

用01分数规划 + prime + 二分 竟然2950MS惊险的过了QAQ 前提是在TLE了好几次下过的 = = 题目意思:有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一条路即可,建造水管距离为坐标之间的欧几里德距离,费用为海拔之差,现在要求方案使得费用与距离的比值最小,很显然,这个题目是要求一棵最优比率生成树. 解题思路: 对答案进行二分,当把代进去的答案拿来算最小生成树的时候,一旦总路径长度为0,就是需要的答案. 0-1规划是啥? 概念有带权图G, 对于图中每条

【POJ】【2728】 Desert King 最优比率生成树

题意:给出每个点的坐标(x,y,z),两点间距离是x,y的直线距离,边权为z差,求∑边权 / ∑距离 的最小值. 最优比率生成树!(分数规划) 就是根据分数规划的思想建树,每次看得到的总和是正是负. 二分代码: #include<string.h> #include<stdio.h> #include<stdlib.h> #include<math.h> #define N 1010 typedef struct KSD { int x,y,z; }ksd;

【POJ2728】Desert King 最优比率生成树

题目大意:给定一个 N 个点的无向完全图,边有两个不同性质的边权,求该无向图的一棵最优比例生成树,使得性质为 A 的边权和比性质为 B 的边权和最小. 题解:要求的答案可以看成是 0-1 分数规划问题,即:选定一个数 mid,每次重新构建边权为 \(a[i]-mid*b[i]\) 的图,再在图上跑一遍最小生成树(这里由于是完全图,应该采用 Prim 算法)判断最小值和给定判定的最小值的关系即可,这里为:若最小值大于 mid,则下界提高,否则上界下降. 代码如下 #include<cmath>