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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值