最优比例生成树,用prim解生成树的权值之和,然后用迭代法求最优比例,也可以用二分法来求
比例。lowc[i] = dh[1][i] - x * dl[1][i],高度差 - 平面距离 * 比例。
/*Accepted 16292K 188MS C++ 1936B 2012-09-22 10:12:11*/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <queue> #include <algorithm> #include <math.h> using namespace std; const int MAXN = 1 << 10; const int INF = 0x3f3f3f3f; double dl[MAXN][MAXN], dh[MAXN][MAXN], pt[MAXN][3]; int n, p; bool vis[MAXN]; double lowc[MAXN], lowh[MAXN], lowl[MAXN], minc; double distance(int i, int j, int k) { return (pt[i][k] - pt[j][k]) * (pt[i][k] - pt[j][k]); } double prim(double x) { double ans = 0, minc, hh = 0, ll = 0; memset(vis, false, sizeof vis); vis[1] = true; for(int i = 1; i <= n; i ++) lowc[i] = dh[1][i] - x * dl[1][i], lowh[i] = dh[1][i], lowl[i] = dl[1][i]; for(int i = 1; i < n; i ++) { minc = INF, p = -1; for(int j = 1; j <= n; j ++) { if(!vis[j] && minc > lowc[j]) { minc = lowc[j], p = j; } } ans += minc, vis[p] = true; hh += lowh[p], ll += lowl[p]; for(int j = 1; j <= n; j ++) { if(!vis[j] && lowc[j] > dh[p][j] - x * dl[p][j]) { lowc[j] = dh[p][j] - x * dl[p][j]; lowh[j] = dh[p][j], lowl[j] = dl[p][j]; } } } return hh / ll; } void ReadGraph() { for(int i = 1; i <= n; i ++) { scanf("%lf%lf%lf", &pt[i][0], &pt[i][1], &pt[i][2]); } for(int i = 1; i <= n; i ++) { for(int j = 1; j <= n; j ++) { dl[i][j] = sqrt(distance(i, j, 0) + distance(i, j , 1)); dh[i][j] = fabs(pt[i][2] - pt[j][2]); } } } int main() { while(scanf("%d", &n), n) { ReadGraph(); double r = 1000, tmp = 0; while(fabs(r - tmp) > 1e-5) { r = tmp; tmp = prim(r); } printf("%.3f\n", r); } return 0; }
浙公网安备 33010602011771号