码迷,mamicode.com
首页 > Web开发 > 详细

Arctic Network poj 2349

时间:2016-07-22 18:59:10      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:

http://poj.org/problem?id=2349  

 

题意:现有 m 个地点, n 个卫星。  卫星有一个神奇的作用, 作用在于只要某个地方安装有卫星, 不论他们之间距离为多远, 都能够互相接收到彼此间信 号, (这么好的东西当然不会让每个地方都有的), 那么其他地方需要通过收发器 D 来连接。让你求1 - m 个地方在共安装过 n 个卫星后,我们所需要     的 收发器 D 所需的最大距离是多少?

 

 

*****一开始提交错误仍然是因为%lf和%f,吸取吸取教训。。。

*******问:有人告诉我不能在printf中使用%lf。为什么printf()用%f输出double型,而scanf却用%lf呢?

     答:printf的%f说明符的确既可以输出float型又可以输出double型。根据“默认参数提升”规则(在printf这样的函数的可变参数列表中,不论作用域内有没有原型,都适用这一规则)float型会被提升为double型。因此printf()只会看到双精度数。

(严格地讲,%lf在printf下是未定义的,但是很多系统可能会接受它。要确保可移植性,就要坚持使用%f。)

对于scanf,情况就完全不同了,它接受指针,这里没有类似的类型提升。(通过指针)向float存储和向double存储大不一样,因此,scanf区别%f和%lf。


技术分享
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std;

#define maxn 1510
#define oo 0x3f3f3f3f
double maps[maxn][maxn], dist[maxn], p[maxn];
int  v[maxn];
int n, m;

struct node
{
    int x, y;
}s[maxn];

void Init()
{
    int i, j;

    for(i=1; i<=m; i++)
    {
        for(j=1; j<=m; j++)
        {
            if(i==j) maps[i][j]=0;
            else maps[i][j] = maps[j][i] =oo;
        }
    }
}

void Dij()
{

    memset(v, 0, sizeof(v));
    for(int i=1; i<=m; i++)
        dist[i] = maps[1][i];
        v[1] = 1;

    for(int i=1; i<m; i++)
    {
        int index=-1;
         p[i] = 1000000.0;
        for(int j=1; j<=m; j++)
        {
            if(!v[j] && dist[j]<p[i])
            {
                index = j;
                p[i] = dist[j];
            }
        }

        v[index] = 1;

        for(int j=1; j<=m; j++)
        {
            if(!v[j] && dist[j]>maps[index][j])
                dist[j] = maps[index][j];
        }
    }

}
int main()
{
    int T;
    scanf("%d", &T);

    while( T --)
    {
        scanf("%d %d", &n, &m);

        Init();

        for(int i=1; i<=m; i++)
            scanf("%d %d", &s[i].x, &s[i].y);

        for(int i=1; i<m; i++)
        {
            for(int j=i+1; j<=m; j++)
            {
                double l = sqrt((s[i].x-s[j].x)*(s[i].x-s[j].x)+(s[i].y-s[j].y)*(s[i].y-s[j].y));
                maps[i][j] = maps[j][i] = min(maps[i][j], l);
            }
        }

        Dij();

        sort(p+1, p+m);

        printf("%.2f\n", p[m-n]);
    }
    return 0;
}
View Code

 


 

Arctic Network poj 2349

标签:

原文地址:http://www.cnblogs.com/daydayupacm/p/5695874.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!