您的位置:首页 > 其它

poj2728 (01参数规划,最优化率生成树,二分)

2012-07-06 15:48 190 查看
这题01参数规划,其实就是二分,最优率生成树,但是精度卡的太死了,,要么WA,要么TLE。
二分 重新构图 : graph[i][j]=fabs(dot[i].h-dot[j].h)-mid*dis(dot[i].x,dot[i].y,dot[j].x,dot[j].y);



#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include <cstdio>
using namespace std;
#define MAX 1001
#define INF 1000000000
struct node
{

    double x,y,h;
}dot[MAX];

inline double dis(double x1,double y1,double x2,double y2)
{

    return sqrt( (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1) );
}

double graph[MAX][MAX];

inline void creat(int n,double l)
{
    int i,j;
    for(i=1;i<=n;i++)
    {

        for(j=1;j<=n;j++)
        {

            graph[i][j]=fabs(dot[i].h-dot[j].h)-l*dis(dot[i].x,dot[i].y,dot[j].x,dot[j].y);
        }
    }
}

inline double prim(double graph[MAX][MAX],int n)
{
    bool visit[MAX]={0};
    int mark;
    double dis[MAX];
    double ans=0;
    int i,j;
    visit[1]=true;
    for(i=1;i<=n;i++)
        dis[i]=graph[1][i];
    for(i=1;i<n;i++)
    {

        int minnum=INF;
        for(j=1;j<=n;j++)
        {

            if(!visit[j]&&dis[j]<=minnum)
            {
                minnum=dis[j];
                mark=j;
            }
        }
        visit[mark]=true;
        ans+=dis[mark];
        for(j=1;j<=n;j++)
        {
            if(!visit[j]&&graph[mark][j]<dis[j])
                dis[j]=graph[mark][j];
        }

    }
    return ans;
}

int main()
{

    int i,j;
    int n;
    double res;
    while(scanf("%d",&n))
    {

        if(n==0)
            break;
        for(i=1;i<=n;i++)
        {
            scanf("%lf%lf%lf",&dot[i].x,&dot[i].y,&dot[i].h);
        }
        double front,rear;
        front=0;
        rear=100;//这个地方有点悬。。。
        double mid;
        double pre=0.0;
        while(front<=rear)
        {

            mid=(front+rear)/2;
            creat(n,mid);
            res=prim(graph,n);
            if(fabs(res-pre)<=0.0005)
                break;
            else if(res>0.0005)
                front=mid;
            else
                rear=mid;
        }
        printf("%.3lf\n",mid);
    }
    return 0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: