zoukankan      html  css  js  c++  java
  • 最优比例生成树模板

    /*
        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
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    【NOIP2013】花匠
    【DP合集】tree-knapsack
    【DP合集】m-knapsack
    【DP合集】背包 bound
    【DP合集】合并 union
    【DP合集】棋盘 chess
    BZOJ1026 [SCOI2009]windy数
    最长上升子序列 LIS nlogn
    再谈线性基
    数论问题算法模板
  • 原文地址:https://www.cnblogs.com/Kurokey/p/5738631.html
Copyright © 2011-2022 走看看