POJ 2349 Arctic Network (MST中的第K长路)

来源:互联网 发布:php商城分销系统源码 编辑:程序博客网 时间:2024/04/30 12:44

题目: 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 505int 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;}