poj2349 Arctic Network

题意:

某地区共有n座村庄,每座村庄的坐标用一对整数(x, y)表示,现在要在村庄之间建立通讯网络。
通讯工具有两种,分别是需要铺设的普通线路和无线通讯的卫星设备。
只能给k个村庄配备卫星设备,拥有卫星设备的村庄互相间直接通讯。
铺设了线路的村庄之间也可以通讯。但是由于技术原因,两个村庄之间线路长度最多不能超过 d, 否则就会由于信号衰减导致通讯不可靠。要想增大 d 值,则会导致要投入更多的设备(成本)。

已知所有村庄的坐标 (x , y) ,卫星设备的数量 k 。
问:如何分配卫星设备,才能使各个村庄之间能直接或间接的通讯,并且 d 的值最小?求出 d 的最小值。
数据规模:0 <= k <= n<= 500

思路:

只需找到一个最小的d,使得连通支的个数小于等于卫星设备的数目。把整个问题看做一个完全图,只需在该图上求最小生成树,d 的最小值即为第 K 长边。因为:最小生成树中的最长k-1条长边都去掉后,正好将原树分成了k 个连通分支,在每个连通分支上摆一个卫星设备即可。

实现:

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <vector>
  4 #include <algorithm>
  5 #include <cmath>
  6 using namespace std;
  7 struct node
  8 {
  9     int x, y;
 10 };
 11 struct edge
 12 {
 13     int a, b;
 14     double cost;
 15 };
 16 vector<node> ns;
 17 vector<edge> es;
 18 int ran[505];
 19 int par[505];
 20 int t, k, n, x, y;
 21
 22 int square(int x)
 23 {
 24     return x * x;
 25 }
 26
 27 bool cmp1(const double & x, const double & y)
 28 {
 29     return x > y;
 30 }
 31
 32 void init(int n)
 33 {
 34     for (int i = 0; i < n; i++)
 35     {
 36         par[i] = i;
 37         ran[i] = 0;
 38     }
 39 }
 40 int find(int x)
 41 {
 42     if (par[x] == x)
 43         return x;
 44     return par[x] = find(par[x]);
 45 }
 46 void unite(int x, int y)
 47 {
 48     x = find(x);
 49     y = find(y);
 50     if (x == y)
 51         return;
 52     if (ran[x] < ran[y])
 53     {
 54         par[x] = y;
 55     }
 56     else
 57     {
 58         par[y] = x;
 59         if (ran[x] == ran[y])
 60         {
 61             ran[x] ++;
 62         }
 63     }
 64 }
 65 bool same(int x, int y)
 66 {
 67     return find(x) == find(y);
 68 }
 69
 70 bool cmp(edge a, edge b)
 71 {
 72     return a.cost < b.cost;
 73 }
 74
 75 void kru(vector<double> & res, int m)
 76 {
 77     init(n);
 78     sort(es.begin(), es.end(), cmp);
 79     for (int i = 0; i < m; i++)
 80     {
 81         if (!same(es[i].a, es[i].b))
 82         {
 83             unite(es[i].a, es[i].b);
 84             res.push_back(es[i].cost);
 85         }
 86     }
 87 }
 88
 89 int main()
 90 {
 91     cin >> t;
 92     while (t--)
 93     {
 94         ns.clear();
 95         es.clear();
 96         cin >> k >> n;
 97         for (int i = 0; i < n; i++)
 98         {
 99             cin >> x >> y;
100             node tmp;
101             tmp.x = x;
102             tmp.y = y;
103             ns.push_back(tmp);
104         }
105         for (int i = 0; i < ns.size(); i++)
106         {
107             for (int j = i + 1; j < ns.size(); j++)
108             {
109                 edge e;
110                 e.a = i;
111                 e.b = j;
112                 e.cost = sqrt(square(ns[i].x - ns[j].x) + square(ns[i].y - ns[j].y));
113                 es.push_back(e);
114                 e.a = j;
115                 e.b = i;
116                 es.push_back(e);
117             }
118         }
119         vector<double> res;
120         kru(res, es.size());
121         sort(res.begin(), res.end(), cmp1);
122         printf("%.2f\n", res[k - 1]);
123     }
124     return 0;
125 }

 总结:

还有次小生成树、最大生成树等

时间: 2024-09-30 18:33:00

poj2349 Arctic Network的相关文章

[Poj2349]Arctic Network(二分,最小生成树)

[Poj2349]Arctic Network Description 国防部(DND)要用无线网络连接北部几个哨所.两种不同的通信技术被用于建立网络:每一个哨所有一个无线电收发器,一些哨所将有一个卫星频道. 任何两个有卫星信道的哨所可以通过卫星进行通信,而不管他们的位置.同时,当两个哨所之间的距离不超过D时可以通过无线电通讯,D取决于对收发器的功率.功率越大,D也越大,但成本更高.出于采购和维修的方便,所有哨所的收发器必须是相同的:那就是说,D值对每一个哨所相同. 你的任务是确定收发器的D的最

poj2349 Arctic Network - 最小生成树

2017-08-04 16:19:13 writer:pprp 题意如下: Description The Department of National Defence (DND) wishes to connect several northern outposts by a wireless network. Two different communication technologies are to be used in establishing the network: every o

POJ2349:Arctic Network(二分+最小生成树)

Arctic Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 28311   Accepted: 8570 题目链接:http://poj.org/problem?id=2349 Description: The Department of National Defence (DND) wishes to connect several northern outposts by a wireless net

POJ 2349 Arctic Network

Arctic Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18447   Accepted: 5829 Description The Department of National Defence (DND) wishes to connect several northern outposts by a wireless network. Two different communication tec

POJ 2349 Arctic Network (最小生成树第K大(小)边)

Arctic Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13108   Accepted: 4256 Description The Department of National Defence (DND) wishes to connect several northern outposts by a wireless network. Two different communication tec

POJ2032 Arctic Network(Prim)

Arctic Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16968   Accepted: 5412 Description The Department of National Defence (DND) wishes to connect several northern outposts by a wireless network. Two different communication tec

POJ2349&amp;ZOJ1914--Arctic Network【最小生成树】

链接:http://poj.org/problem?id=2349 题意:北极有一些村庄,现需要在这些村庄间建立起通讯,有s个卫星频道,任何两个拥有卫星频道的村庄都可以直接通过卫星进行通讯而无视距离,没有卫星的村庄通过无线电进行通讯,并且这两个村庄的距离不能超过D,D值取决于无线电收发器的功率,功率越大,D值越大,但价格也越高,出于购买费用和维护费用的考虑,所有村庄的无线电收发器都相同,即D值相同,现要求在保证任意两个村庄间都能直接或间接通讯,并且D值最小,输出这个最小值. 就是输出最小生成树最

UVA 10369 Arctic Network

题目来源:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1310 最小生成树问题,Prim算法在这种给出坐标的情况相对Kruskal算法优势还是很大. 1 /*AC 19ms*/ 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<math.h> 5 #

POJ 2349 Arctic Network 最小生成树题解

本题也是使用Prime和Kruskal都可以的最小生成树的题解. 本题一点新意就是:需要除去最大的S-1个距离,因为可以使用卫星覆盖这些距离. 技巧:建图建有向图,速度快点,不用计算两边. 这里使用Prime,因为是稠密图. #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> #include <limits.h> #include <al