• poj 2728 最优比例生成树(01分数规划)模板


    /*
    迭代法 :204Ms
    */
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #define N  1100
    #define eps 1e-10
    #define inf  0x3fffffff
    struct node {
     int u,v,w;
    }p[N];
    double ma[N][N];
    double distance(int i,int j) {
    return sqrt(1.0*(p[i].u-p[j].u)*(p[i].u-p[j].u)+1.0*(p[i].v-p[j].v)*(p[i].v-p[j].v));
    }
    int n;
    double prime(int u,double r) {
      int i,j,vis[N],pre[N];
      double dis[N],len=0,cost=0,total=0;
      for(i=1;i<=n;i++)  {
          dis[i]=fabs(1.0*p[u].w-1.0*p[i].w)-ma[u][i]*r;
          pre[i]=u;
      }
      memset(vis,0,sizeof(vis));
      vis[1]=1;
      for(i=1;i<n;i++) {
        double  minn=inf;
        int index=-1;
        for(j=1;j<=n;j++)
            if(!vis[j]&&minn>dis[j]) {
                minn=dis[j];
                index=j;
            }
        if(index!=-1) {
            vis[index]=1;
            len+=ma[pre[index]][index];
            cost=cost+fabs(1.0*p[pre[index]].w-1.0*p[index].w);
            //total+=dis[index];
            for(j=1;j<=n;j++) {
                double f=fabs(1.0*p[index].w-1.0*p[j].w)-ma[index][j]*r;
                if(!vis[j]&&f<dis[j]) {
                    dis[j]=f;
                    pre[j]=index;
                }
            }
        }
      }
     // return total;
     return cost/len;
    }
    int main() {
        int i,j;
        while(scanf("%d",&n),n) {
            for(i=1;i<=n;i++)
                scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].w);
            for(i=1;i<=n-1;i++)
                for(j=i+1;j<=n;j++)
                ma[i][j]=ma[j][i]=distance(i,j);
              /*  double l=0.0,r=100.0;
                while(r-l>eps) {
                    double mid=(l+r)/2;
                    if(prime(1,mid)>=0)l=mid;
                    else  r=mid;
                }*/
                double a=0,b;
                while(1) {
                    b=prime(1,a);
                    if(fabs(a-b)<eps)break;
                    a=b;
                }
            //printf("%.3f
    ",r);
            printf("%.3f
    ",b);
        }
    return 0;
    }
    
    /*
    二分法:1766ms
    */
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #define N  1100
    #define eps 1e-10
    #define inf  0x3fffffff
    struct node {
     int u,v,w;
    }p[N];
    double ma[N][N];
    double distance(int i,int j) {
    return sqrt(1.0*(p[i].u-p[j].u)*(p[i].u-p[j].u)+1.0*(p[i].v-p[j].v)*(p[i].v-p[j].v));
    }
    int n;
    double prime(int u,double r) {
      int i,j,vis[N],pre[N];
      double dis[N],len=0,cost=0,total=0;
      for(i=1;i<=n;i++)  {
          dis[i]=fabs(1.0*p[u].w-1.0*p[i].w)-ma[u][i]*r;
          pre[i]=u;
      }
      memset(vis,0,sizeof(vis));
      vis[1]=1;
      for(i=1;i<n;i++) {
        double  minn=inf;
        int index=-1;
        for(j=1;j<=n;j++)
            if(!vis[j]&&minn>dis[j]) {
                minn=dis[j];
                index=j;
            }
        if(index!=-1) {
            vis[index]=1;
           // len+=ma[pre[index]][index];
            //cost=cost+fabs(1.0*p[pre[index]].w-1.0*p[index].w);
            total+=dis[index];
            for(j=1;j<=n;j++) {
                double f=fabs(1.0*p[index].w-1.0*p[j].w)-ma[index][j]*r;
                if(!vis[j]&&f<dis[j]) {
                    dis[j]=f;
                    pre[j]=index;
                }
            }
        }
      }
      return total;
    // return cost/len;
    }
    int main() {
        int i,j;
        while(scanf("%d",&n),n) {
            for(i=1;i<=n;i++)
                scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].w);
            for(i=1;i<=n-1;i++)
                for(j=i+1;j<=n;j++)
                ma[i][j]=ma[j][i]=distance(i,j);
                double l=0.0,r=100.0;
                while(r-l>eps) {
                    double mid=(l+r)/2;
                    if(prime(1,mid)>=0)l=mid;
                    else  r=mid;
                }
                /*double a=0,b;
                while(1) {
                    b=prime(1,a);
                    if(fabs(a-b)<eps)break;
                    a=b;
                }*/
            printf("%.3f
    ",r);
            //printf("%.3f
    ",b);
        }
    return 0;
    }
    


  • 相关阅读:
    如何利用京东云的对象存储(OSS)上传下载文件
    2017年4月8日Office 365 使用CSV文件导入邮件组
    在Office 365 的如何给管理员赋予查看所有人邮箱的权限的Powershell
    Office 365 Powershell 连接命令
    Office365创建通讯组
    国际版删除域名的步骤
    如何停止AAD服务
    导出Office365中的组及成员
    AWS/阿里/Azure,云厂商价格大PK
    OA系统与Exchange 日历打通
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6889241.html
Copyright © 2020-2023  润新知