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

关键词:0/1分数规划,参数搜索,二分法,dinkelbach

参考资料:http://hi.baidu.com/zzningxp/item/28aa46e0fd86bdc2bbf37d03

               http://hi.baidu.com/zheng6822/item/b31fbe9d5ae17536336eeb8f

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<math.h>
#define N 1010
#define INF 1e15
#define eps 1e-10
using namespace std;
double X[N],Y[N],Z[N];
double cost[N][N];
double lowcost[N];
int closest[N];int vis[N];
int n;double r;
double disc(int i,int j)
{
    return fabs(Z[i]-Z[j]);
}
double disd(int i,int j)
{
    return sqrt((X[i]-X[j])*(X[i]-X[j])+(Y[i]-Y[j])*(Y[i]-Y[j]));
}
double prim(double r)
{
    double sumc=0;double sumd=0;
    for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    {
        if(i==j)
        cost[i][j]=INF;
        else
        cost[i][j]=disc(i,j)-r*disd(i,j);
    }
    for(int i=0;i<n;i++)
    {
        lowcost[i]=cost[0][i];
        vis[i]=0;
        closest[i]=0;
    }
    closest[0]=0;
    vis[0]=1;
    int k;
    for(int i=0;i<n;i++)
    {
        double tmp=INF;
        for(int j=0;j<n;j++)
        if(!vis[j]&&tmp>lowcost[j])
        {
            k=j;
            tmp=lowcost[j];
        }
        vis[k]=1;
        for(int j=0;j<n;j++)
        if(!vis[j]&&lowcost[j]>cost[k][j])
        {
            lowcost[j]=cost[k][j];
            closest[j]=k;
        }
    }
    for(int i=0;i<n;i++)
    {
        sumc+=disc(i,closest[i]);
        sumd+=disd(i,closest[i]);
    }
    return sumc/sumd;
}
int main()
{
    while(scanf("%d",&n)!=EOF&&n)
    {
        for(int i=0;i<n;i++)
        cin>>X[i]>>Y[i]>>Z[i];
        double r1=0,r2=0;
        while(1)
        {
            r2=prim(r1);
            if(fabs(r1-r2)<=eps)
            break;
            r1=r2;
        }
        printf("%.3f\n",r1);
    }
    return 0;
}
PRIM+迭代法

相关文章:

  • 2021-08-12
  • 2022-02-08
  • 2021-12-09
  • 2021-07-10
  • 2022-02-09
猜你喜欢
  • 2021-06-02
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-27
  • 2022-02-11
相关资源
相似解决方案