您的位置:首页 > 其它

poj 2728 二分图

2017-01-18 22:42 176 查看
第一次接触二分,然后还是感觉有点迷迷糊糊,额,以后学二分的时候再拿出来看看吧。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
#define INF 9999999999
#define MAXN 1005
struct node
{
double x,y,h;
}Point[MAXN];
double dis[MAXN][MAXN],c[MAXN][MAXN];
double h[MAXN][MAXN];
int n;
double prim()//这个prim理解的还是蛮深刻
{
int i,j,k;
double ans=0.0,mina;
int vis[MAXN];
double d[MAXN];
for(i=0;i<n;i++)
{
d[i]=c[0][i];
vis[i]=0;
}
d[0]=1;
vis[0]=1;
for(i=1;i<n;i++)
{
mina=INF;
for(j=0;j<n;j++)
if(!vis[j]&&d[j]<mina)
{
mina=d[j];
k=j;
}
ans+=mina;
vis[k]=1;
for(j=0;j<n;j++)
if(!vis[j]&&d[j]>c[k][j])
d[j]=c[k][j];
}
return ans;
}
int main()
{
int i,j;
double maxc,minc,maxl,minl,mid;
while(scanf("%d",&n),n)
{
memset(Point ,0,sizeof(Point));
memset(h,0,sizeof(h));
memset(dis,0,sizeof(dis));
memset(c,0,sizeof(c));
maxc=-INF;
minc=INF;
maxl=-INF;
minl=INF;
for(i=0;i<n;i++)
scanf("%lf %lf %lf",&Point[i].x,&Point[i].y,&Point[i].h);
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
{
h[i][j]=h[j][i]=abs(Point[i].h-Point[j].h);
dis[i][j]=dis[j][i]=sqrt((Point[i].x-Point[j].x)*(Point[i].x-Point[j].x)+(Point[i].y-Point[j].y)*(Point[i].y-Point[j].y));
if(maxc<dis[i][j])
maxc=dis[i][j];
if(minc>dis[i][j])
minc=dis[i][j];
if(maxl<h[i][j])
maxl=h[i][j];
if(minl>h[i][j])
minl=h[i][j];
}
double head=minl/maxc;//大概范围
double last=maxl/minc;
while(last-head>1e-5)//二分
{
mid=(head+last)/2;
for(int i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
c[i][j]=c[j][i]=h[i][j]-mid*dis[i][j];
}
if(prim()<=0.0)
last=mid;
else
head=mid;
}
printf("%.3f\n",head);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: