思路:設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#include#include
#include
#include
#define maxn 1010
#define maxm maxn*maxn
#define inf 1e16
#define eps 1e-6
using
namespace
std;
intvi[maxn],n;
double
dis[maxn][maxn],cost[maxn][maxn],benefit[maxn][maxn],far[maxn];
struct
pointp[maxn];
void
init()
double
dis(point a,point b)
double prime(double
r) }
vi[temp]=1
; ans+=max;
//dis[temp][j]-cost[temp][j]
for(j=1;j<=n;j++)
}return
ans;
}int
main()
for(i=1;i)
}double
l,r,mid;
l=0,r=100000
;
double
temp;
while(r-l>eps)
printf(
"%.3lf\n
",l);
}return0;
}
poj2728 最優比率生成樹
這個題的意思是給你乙個連通圖,圖上每個點都有連個權值ai,bi讓你選乙個生成樹使得sigma ai xi sigma bi xi 最小,對比與基礎的01規劃,我們假設答案是mid,然後建立乙個圖,其新的邊的權值是ai mid bi,然後求解最小生成樹,假設其答案是tp,如果tp 0,說明還有更優的解...
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...
poj2728 最優比率生成樹
題意 乙個無向圖,每條邊有兩個權值,h和l,要求乙個生成樹,使得所有邊的h的和比上l的和最小。設x i 等於1或0,表示邊e i 是否屬於生成樹.則我們所求的比率 r benifit i x i cost i x i 0 i為了使 r 最小,設計乙個子問題 讓 z benifit i x i k c...