题目: http://poj.org/problem?id=2349
1)关于题意,开始code完了,才发现,样例都解释不过去,题意理解错误,最后才明白是求MST种的长度排序后的第K长的权值,这个题意的叙述 相当无语
2) 我很挫, 连qsort的double 类型的比较都可以不会,其中返回值时 类型的强制转化 都 忘了
在对浮点或者double型的一定要用三目运算符,因为如果也使用整型那样的想减的话,如果是两个很接近的数则可能返回一个小数(大于-1,小于1),而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系
就因为这个WA倒无语。。。。。
代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define PI acos(-1.0)
#define max(a,b) (a)>(b)? (a):(b)
#define min(a,b) (a)>(b)? (b):(a)
#define INT_MIN -0x7FFFFFFF
#define INT_MAX 10000000.0//0x7FFFFFF
#define M 1005
#define P 505
int s,p;
int n;
double map[P][P];
double mark[P];
struct node
{
double x,y;
}point[P];
double edge[P];
int ar_edge;
/*int cmp(const void *p1,const void *p2)
{
double a=*(double *)p1;
double b=*(double *)p2;
if(fabs(a-b)<=0.000001) return 0;
return b-a;
}*/
int cmp1( const void *a , const void *b )
{
return *(double *)a < *(double *)b ? 1 : -1;
}
double di(struct node p1,struct node p2)
{
return ( sqrt( (p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y))) ;
}
void prim(int v)
{
int i,j,k;
ar_edge=0;
for(i=0;i<=p;i++)
{
mark[i]=map[v][i];
}
mark[v]=-1;
for(i=1;i<p;i++)
{
double mi=INT_MAX;
int ar=-1;
for(j=1;j<=p;j++)
{
if(mark[j]>=0 && mi>mark[j])
{
ar=j; mi=mark[j];
}
}
if(ar!=-1)
{
mark[ar]=-1;
edge[ar_edge++]=mi;
for(j=1;j<=p;j++)
{
if(mark[j]>=0 && mark[j]>map[ar][j])
{
mark[j]=map[ar][j];
}
}
}
}
qsort(edge,ar_edge,sizeof(edge[1]),cmp1);
printf("%.2f\n",edge[s-1]);
}
int main()
{
//freopen("in.txt","r",stdin);
int i,j,k;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&s,&p);
for(i=1;i<=p;i++)//from 1
{
scanf("%lf%lf",&point[i].x,&point[i].y);
}
for(i=1;i<=p;i++)
{
for(j=1;j<=p;j++)
{
map[i][j]=di(point[i],point[j]);
}
}
prim(1);
}
return 0;
}