poj 2728(最優比率生成樹 二分)

2022-04-04 16:18:30 字數 1756 閱讀 3301

題目大意是:給你座標上一些點,然後你需要用一些邊把他們連線起來,邊有費用和長度,求總費用和總長度最小比值。

二分答案:

每邊有兩權值(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...