最小比率生成树:每条边有花费和距离.选取的N-1 条边.使得花费总和Σcost/Σdist 距离总和最小.
<span style="font-family:FangSong_GB2312;font-size:14px;"><strong>最小比率生成树
//kruskal+Dinke(可用二分)
double mid=0,b;
int cnt; //加入MST中的节点个数
while (1){
for (int i=1;i<=m;i++)
dis[i].w=dis[i].h-dis[i].s*mid; //求每个节点的当前权值
sort(dis+1,dis+1+m);
for (int i=0;i<=n;i++) pre[i]=i; //并查集的初始化
cnt=1;
double cost=0,dist=0;
for (int i=1;i<=m;i++){
if (merge_DS(dis[i].a,dis[i].b)){
cost+=dis[i].h;dist+=dis[i].s;
if (++cnt==n) break;
}
}
b=cost/dist; //获得的新的mid
if (fabs(b-mid)<1e-5) break; //如果达到精度要求跳出循环
mid=b;
}</strong></span>
相关题目:
Poj 2728