极地网络

极地网络
时间限制 : 10000 MS   空间限制 : 65536 KB

问题描述

国防部想要通过无线网络与北极地区的一些军事哨所建立通讯连接。有两种不同的通讯技术将要被用来建立这个网络系统:无线电和卫星电话。每个哨所都将配置无线电收发器。只有部分哨所将配置卫星电话。
任意两个配置了卫星电话的哨所可以通过卫星来通信,卫星通信不受地域和距离的限制。但是任意两个哨所想要通过无线电来通信的话,就有距离限制了,两者的距离不能超过D公里,这个距离D由无线电收发器的功率决定。无线电设备的功率越大,通信距离越远,但是价格也越高。处于价格和保养的考虑,国防部决定所有的哨所都使用相同的无线电收发器,也就是说每个哨所的无线电收发器的最大通信距离D都是相同的。
你的工作就是决定无线电设备的传输距离D最小应该是多少,才能保证任意两个哨所间都有直接或间接的通信线路可以通信。

输入格式

第一行两个整数S(1 <= S <= 100)和P(S < P <= 500),S表示可供使用的卫星电话的数量,P表示哨所的数量。

接下来P行,每行两个整数X和Y,表示一个哨所的位置坐标,单位是公里。(0<=X,Y<=10000)

输出格式

一个包含两个小数位的实数,表示无线电设备的最小通信距离。

样例输入 1

2 4
0 100
0 300
0 600
150 750

样例输出 1

212.13

样例输入 2

1 2
0 0
100 100

样例输出 2

141.4

  

此题,解法其实不难,只要会最小生成树即可。其做法主要为以下几步:

1.把国防基地看作一幅图,其中基站为点,而边呢,我们则需要自己连接,形成一个完全图。

写一个两重循环,把每个点与其它所有点都连起来即可。

2.使用Kruskal算法即可,当总点数减去已合并的点数已经等于卫星电话的台数,说明每个基站便都可以

通话了,此时,便输出已合并的最长边条数。
#include <bits/stdc++.h>

using namespace std;

struct node{
    int a, b;
    int len;
};

struct base{
    int x, y;
};

base b[500 + 5] = {}; 
node edge[500 * 499 / 2 + 5] = {};
int father[500 + 5] = {};
int s, p;
int tot = 0;

bool cmp(node a, node b)
{
    return a.len < b.len;    
}

int getfather(int x)
{
    if(x != father[x]){
        father[x] = getfather(father[x]);    
    }
    return father[x];
}
   
void  kruskal()
{
    int x, y, k, cnt;
    cnt = 0;
    k = 0;    
    while(cnt < p - 1){
        k++;
        x = getfather(edge[k].a);
        y = getfather(edge[k].b);
        if(x != y){
            father[x] = y;            
            cnt++;
            if(p - cnt == s){
                printf("%.02f", sqrt(edge[k].len));
                break;
            }
        }
    }    
}        

int main()
{
    cin >> s >> p;    
    for(int i = 1; i <= p; i++){
        int x, y;        
        cin >> b[i].x >> b[i].y;        
    }    

    for(int i = 1; i <= p - 1; i++){
        for(int j = 1; j <= p - i; j++){
            int v1 = i;
            int v2 = i + j;
            tot++;
            edge[tot].a = v1;
            edge[tot].b = v2;
            int dx = b[v1].x - b[v2].x;
            int dy = b[v1].y - b[v2].y;
            edge[tot].len = dx * dx + dy * dy;            
        }
    }

    for(int i = 1; i <= p; i++){
        father[i] = i;
    }

    sort(edge + 1, edge + 1 + tot, cmp);    
    kruskal();
    
    return 0;
}

不喜勿喷!!!!蟹蟹

猜你喜欢

转载自www.cnblogs.com/ctime/p/11851676.html