标签:
/* 01最优(小)比例生成树 求最大比例更改prim即可 poj2728 将图中点连成一棵树满足 总花费/总长度 最小 */ int n,m; double d[1005],cost[1005],ben[1005]; double pic[1005][1005]; ///两点间距离 double cpic[1005][1005]; ///两点间花费 int vis[1005]; int pre[1005]; ///记录父节点 struct Node{ int x,y,h; double ans; }node[1111]; double prim(double mid){ ///用prim思想 mst(vis,0); mst(pre,0); double c=0,b=0; for(int i=0;i<n;++i)d[i]=cpic[0][i]-pic[0][i]*mid; for(int i=1;i<n;++i){ double m=inf;int u=-1; for(int j=1;j<n;++j) if(!vis[j]&&d[j]<m) m=d[u=j]; if(u==-1)break; vis[u]=1; c+=cpic[u][pre[u]]; b+=pic[u][pre[u]]; for(int j=1;j<n;++j) if(!vis[j]&&d[j]>cpic[u][j]-pic[u][j]*mid){ ///cpic[u][j]-pic[u][j]*mid仍然是分数转换思想 ///更新最优(小)比例 d[j]=cpic[u][j]-pic[u][j]*mid; pre[j]=u; } } return c/b; } double dis(int x,int y){ ///求两点间距离 double x1=node[x].x-node[y].x; double y1=node[x].y-node[y].y; double len=sqrt(x1*x1+y1*y1); return len; } int main(){ int i,j,group,temp; while(scanf("%d",&n)!=EOF&&n){ for(i=0;i<n;++i)scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].h); for(i=0;i<n;++i)for(j=i+1;j<n;++j)if(i!=j){ pic[i][j]=pic[j][i]=dis(i,j); cpic[i][j]=cpic[j][i]=fabs(node[i].h-node[j].h); } double ans; double temp=0; do{ ans=temp; temp=prim(ans); }while(fabs(ans-temp)>1e-4); printf("%.3f\n",ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/Kurokey/p/5738631.html