| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
给wa者的一点建议如果你wa的话,是精度没控制好,输入是整数这是肯定的,在计算两点间的距离时
不妨把都转换成整数再计算。
prim能几十ms过,不要怀疑算法:原先一直wa,就是sqrt里少加了几个0.0转换成double。
最后贴下代码:
#include<stdio.h>
#include<cmath>
bool f[1001];
double dis[1001][1001];
double d[1001];
const double INF=1e30;
struct position
{
int x, y;
}po[2001];
double caldistance(position &a , position &b)
{
return sqrt((a.x-b.x+0.0)*(a.x-b.x+0.0)+(a.y-b.y+0.0)*(a.y-b.y+0.0)+0.0);
}
double prim(int n)
{
double ans=0,min;
int i,j,u;
for( i=1; i<=n; i++)
d[i]=dis[1][i];
d[1]=0;
f[1]=true;
for(i=1; i<n; i++)
{
min=INF;
for( j=1; j<=n; j++)
{
if(d[j]<min&&!f[j])
{
min=d[j];
u=j;
}
}
f[u]=1;
ans+=min;
for(j=1; j<=n; j++)
if(!f[j]&&d[j]>dis[u][j])
d[j]=dis[u][j];
}
return ans;
}
int main()
{
int n,m,i,j;
scanf("%d %d",&n,&m);
for(i=1; i<=n; i++)
scanf("%d %d",&po[i].x, &po[i].y);
for(i=1; i<=n; i++)
for(j=1; j<i; j++)
{
dis[i][j]=dis[j][i]=caldistance(po[i],po[j]);
}
int s,t;
for(i=1; i<=m; i++)
{
scanf("%d %d",&s,&t);
dis[s][t]=dis[t][s]=0;
}
double ans=prim(n);
printf("%.2lf\n",ans);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator