| Time Limit: 3000MS | Memory Limit: 65536K | |
| Total Submissions: 21855 | Accepted: 6103 |
Description
Input
Output
Sample Input
4 0 0 0 0 1 1 1 1 2 1 0 3 0
Sample Output
1.000
Source
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<map>
#define eps 1e-8
#define INF 100000000
using namespace std;
int n;
struct node
{
double x,y,z;
}e[1010];
double len[1010][1010],cost[1010][1010],mp[1010][1010],low[1010];
bool vis[1010];
double dis(node a,node b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double prim()
{
memset(vis,0,sizeof(vis));
double minn,ans=0;
int pos;
pos=1,vis[pos]=1;
for(int i=1;i<=n;i++)
{
if(i!=pos)
low[i]=mp[pos][i];
}
for(int i=1;i<n;i++)
{
minn=INF;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&low[j]<minn)
{
pos=j;
minn=low[j];
}
}
vis[pos]=1;
ans+=minn;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&low[j]>mp[pos][j])
low[j]=mp[pos][j];
}
}
return ans;
}
double solve(double mid)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
mp[i][j]=cost[i][j]-mid*len[i][j];
}
}
return prim();
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
for(int i=1;i<=n;i++)
scanf("%lf%lf%lf",&e[i].x,&e[i].y,&e[i].z);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
len[i][j]=dis(e[i],e[j]);
cost[i][j]=abs(e[i].z-e[j].z);
}
}
for(int i=1;i<=n;i++)
mp[i][i]=0;
double l,r,mid;
l=0,r=10000000;
while(r-l>=eps)
{
mid=(l+r)*0.5;
if(solve(mid)>eps)
l=mid;
else
r=mid;
}
printf("%.3f\n",r);
}
return 0;
}
原文:http://www.cnblogs.com/water-full/p/4528016.html