//printf("%.2lf\n",sqrt((double)a[s]));//以后用sqrt自己小心点,而且要用c++提交
//郁闷到了没加double就一直错,不说了,而且g++提交也一直错,c++提交才对
下次看到题目有说用sqrt的时候要小心了,因为精度而产生的问题是比较郁闷的
ps:用vs2008它会会提示sqrt重载问题……以后有关精度问题时先在vs上运行试试……
View Code
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
int w,n;
struct Point
{
int x,y;
}p[505];
int map[505][505];
int a[105],s[505];
int dist[505],k;
int distence(Point a,Point b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
bool cmp(int a,int b)
{
return a>b;
}
double PRIM(int u)
{
int rj,d,i,j;
for(i=1;i<=n;i++)
{
dist[i]=map[u][i];
s[i]=0;
}
s[u]=1;
for(i=1;i<n;i++)//第i条边
{
int min=1000000000;
for(j=1;j<=n;j++)
{
if(dist[j]<min&&!s[j])
{
min=dist[j];
rj=j;
}
}
a[i]=min;
s[rj]=1;
for(j=1;j<=n;j++)
{
if(map[rj][j]<dist[j]&&!s[j])
dist[j]=map[rj][j];
}
}
sort(a+1,a+n,cmp);
return sqrt(double(a[w]));
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
k=0;
memset(map,0,sizeof(map));
scanf("%d%d",&w,&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
}
for(i=1;i<=n;i++)
{
for(j=1;j<i;j++)
{
map[i][j]=map[j][i]=distence(p[i],p[j]);
}
}
printf("%.2lf\n",PRIM(1));
}
return 0;
}
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int g[505][2];
int map[505][505];
bool use[505];
int a[505];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int n,i,j,k,s,t;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&s,&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&g[i][0],&g[i][1]);
use[i]=0;
}
int temp;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i!=j)
{
temp=(g[i][0]-g[j][0])*(g[i][0]-g[j][0])+(g[i][1]-g[j][1])*(g[i][1]-g[j][1]);
map[i][j]=temp;
}
}
}
int add=1,min,rj;
use[1]=1;
for(k=1;k<n;k++)
{
min=999999999;
for(i=1;i<=n;i++)
{
if(use[i]==1)
for(j=1;j<=n;j++)
{
if(use[j]==0&&map[i][j]<min)
{
rj=j;
min=map[i][j];
}
}
}
use[rj]=1;
a[add]=min;
add++;
}
sort(&a[1],&a[n+1],cmp);
printf("%.2lf\n",sqrt((double)a[s]));//郁闷到了没加double就一直错,不说了
}
}