IT民工
加油!

最优比例生成树,用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;
}

 

 

 

posted on 2012-09-22 10:26  找回失去的  阅读(213)  评论(0)    收藏  举报