題目大意是:給你座標上一些點,然後你需要用一些邊把他們連線起來,邊有費用和長度,求總費用和總長度最小比值。
二分答案:
每邊有兩權值(a,b),求∑a/ ∑b最小的生成樹.
設∑a/ ∑b=k --> ∑a=k*∑b --->a1+a2+...an = k*(b1+b2+..bn) ---->∑(ai-k*bi)==0
即邊權變為a-k*b後求mst,看是否<0,如果<0則說明k太大了。>0說明k太小了。
ps:有種迭代的方法。看沒太懂。下次看。
1//file name: 2728.cpp2//
author: missa3//
created time: 2013/2/23 星期六 21:36:48
45 #include6 #include7 #include8 #include9 #include10 #include11 #include12 #include
13 #include14 #include15 #include16 #include
17using
namespace
std;
18#define cl(x,v) memset(x,v,sizeof(x));
19#define r(i,st,en) for(int i=st;i20
const
int maxn = 1e3+5;21
const
int inf = 0x3f3f3f3f;22
const
double eps = 1e-5;23
intn;
24struct
point
2528 point(int x,int y,int
z):x(x),y(y),z(z){}
29};
30double h[maxn][maxn];//
村子的高度差
31double g[maxn][maxn];//
村子的距離
32double prim(int src,double k)//
源點,二分的答案k
3342 vis[src]=1
;43 r(i,1
,n)4454}
55if(flag==-1) break
;56 vis[flag]=1
;57 ans+=min;
58 r(j,1,n+1)59
if(!vis[j] && h[flag][j]-k*g[flag][j]60 dis[j]=h[flag][j]-k*g[flag][j];61}
62return
ans;63}
6465
intmain()
6680 r(i,0
,n)81
r(j,i,n)
8286
/*r(i,1,n+1)
87*/
92/*
93double l=0.0,r=mx;
94while(r-l>eps)
95102
*/103
double l=0,r=0
;104
while(1
)105
111 printf("
%.3f\n
",l);
112}
113return0;
114 }
poj2728 最優比率生成樹
這個題的意思是給你乙個連通圖,圖上每個點都有連個權值ai,bi讓你選乙個生成樹使得sigma ai xi sigma bi xi 最小,對比與基礎的01規劃,我們假設答案是mid,然後建立乙個圖,其新的邊的權值是ai mid bi,然後求解最小生成樹,假設其答案是tp,如果tp 0,說明還有更優的解...
poj 2728 最優比率生成樹
思路 設sum cost i sum dis i r 那麼要使r最小,也就是minsum cost i r dis i 那麼就以cost i r dis i 為邊權重新建邊。當求和使得最小生成樹的 sum cost i r dis i 0時,這個r就是最優的。這個證明是01分數規劃。include ...
POJ2728 最優比率生成樹
一張 n 個結點 m 條邊的無向圖,每條邊有兩個權值 a,b 求一顆生成樹滿足樹上的所有邊 a 權和與 b 權和的商最大。1 n,m 1e4 0 1分數規劃 從長度為 n 的數列 和 中選出若干對,使得選出的 a 之和與 b 之和商最大。即求一組 x i 1 i n,x i 0 or 1 最大化 f...