• 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;
    }
    


  • 相关阅读:
    从跳频技术聊CDMA/WIFI之母海蒂·拉玛传奇的一生
    echarts图表X轴文字过长解决解决方案:根据文字长度自动旋转
    kafka-connect-kudu-sink插件
    mysql8远程连接问题
    zookeeper-3.4.5修改存储1M大小限制
    Java并发之CompletionService详解
    傲视Kubernetes(六):Pod管理及控制器
    傲视Kubernetes(五):注解和命名空间
    Es使用kibana增删改查以及复杂查询
    测试Ik分词器以及增加自己的词汇
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6889241.html
Copyright © 2020-2023  润新知