• poj_2728,最优比率生成树


    http://poj.org/problem?id=2728

    上次也做过类似的,就是花费和路径的比值最小,不过和这不一样。。。。

    证明就网上搜吧。。一大堆。。

    我这是看别人的代码写的,迭代。。。

    错在精度上搞好久了。。。

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    
    const int maxn(1010);
    #define inf 999999999
    int n;
    double g[maxn][maxn], cost[maxn][maxn];
    int vis[maxn];
    double dist[maxn];
    double x[maxn], y[maxn], z[maxn];
    int pre[maxn];
    double prim(double a){
        double totalcost = 0.0, totaldist = 0.0;
        for(int i = 1; i <= n; i ++) pre[i] = 1;
        dist[1] = 0;
        memset(vis, 0, sizeof vis);
        vis[1] = 1;
        for(int i = 2; i <= n; i ++)
          dist[i] = cost[1][i] - g[1][i]*a;
        for(int i = 2; i <= n; i ++){
            int u;
            double min = inf*1.0;
            for(int j = 2; j <= n; j ++){
                if(!vis[j] && dist[j] < min){
                    min = dist[j];
                    u = j;
                }
            }
            vis[u] = 1;
            totalcost += cost[pre[u]][u];
            totaldist += g[pre[u]][u];
            for(int j = 1; j <= n; j ++){
                if(!vis[j] && dist[j] > cost[u][j] - g[u][j]*a){
                    dist[j] = cost[u][j] - g[u][j]*a;
                    pre[j] = u;
                    //printf("%d\n", u);
                }
            }
        }
        return totalcost/totaldist;
    }
    int main(){
        while(scanf("%d", &n), n){
            for(int i = 1; i <= n; i ++){
                scanf("%lf%lf%lf", x+i, y+i, z+i);
                for(int j = 1; j < i; j ++){
                    double tmp = (x[i] - x[j])*(x[i] - x[j]) + (y[i] - y[j])*(y[i] - y[j]);
                    cost[i][j] = cost[j][i] = fabs(z[i] - z[j]);
                    g[i][j] = g[j][i] = sqrt(tmp);
                }
            }
            double a = 0;
            while(true){
                double b = prim(a);
                //printf("%.f\n", fabs(b-a));
                if(fabs(b-a) < 0.0001) break;
                a = b;
                //printf("      %.f\n", a);
            }
            printf("%.3f\n", a);
        }
        return 0;
    }
  • 相关阅读:
    设计克制
    高性能动画的
    点选日历控件
    adobe工具软件应用
    Visual Studio 2022 性能增强:更快的 C++、优化 Git 分支切换
    省市县的字典表
    Hype 4.0(Mac系统)的布局功能
    RN相关的文章超过100篇高质量文章
    前端格局
    移动端关于平方字体的适配
  • 原文地址:https://www.cnblogs.com/louzhang/p/2671079.html
Copyright © 2020-2023  润新知