(最小生成树/最小瓶颈生成树) 2017武汉现场赛 - Wifi Relay

题意:

n个无线AP,有xy坐标属性,现在n个无线AP要桥接在一起不能断开连接,现在要求无线AP无线网络的覆盖半径最小是多少

分析:

看起来是像是最小生成树,这里是是求生成树中最长的边最短,就是最小瓶颈生成树。

可以证明最小瓶颈生成树就是最小生成树,详细看刘汝佳《算法入门经典训练指南》343页。

当时现场的时候,想试试最小生成树了,结果以为n方复杂度过不去,就没写,现在想起来,真是坑哦。

这题n有10000,所以不能直接建邻接矩阵,而是采用动态计算距离就行了。

比赛结束了随便一写就A了。。。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4
 5
 6 using namespace std;
 7
 8 const int inf = 0x3f3f3f3f;
 9 const int maxn = 10010;
10
11 double x[maxn];
12 double y[maxn];
13
14 int n;
15
16 double lowc[maxn];
17 bool vis[maxn];
18
19 double dis(double x1, double y1, double x2, double y2) {
20     return sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
21 }
22
23 double prim() {
24     double res = 0;
25     memset(vis, 0, sizeof(vis));
26     vis[0] = true;
27     for(int i = 1; i < n; i++)lowc[i] = dis(x[0], y[0], x[i], y[i]);
28     for(int i = 1; i < n; i++) {
29         double minc = inf;
30         int p = -1;
31         for(int j = 0; j < n; j++) {
32             if(!vis[j] && lowc[j] < minc) {
33                 minc = lowc[j];
34                 p = j;
35             }
36         }
37         res = max(res, minc);
38         vis[p] = true;
39         for(int j = 0; j < n; j++) {
40             double d = dis(x[p], y[p], x[j], y[j]);
41             if(!vis[j] && lowc[j] > d) {
42                 lowc[j] = d;
43             }
44         }
45     }
46     return res / 2;
47 }
48
49
50 int main() {
51     while(~scanf("%d", &n)) {
52         for(int i = 0; i < n; i++) {
53             scanf("%lf%lf", &x[i], &y[i]);
54         }
55         printf("%.9f\n", prim());
56
57     }
58
59     return 0;
60
61 }
时间: 2024-10-22 01:53:11

(最小生成树/最小瓶颈生成树) 2017武汉现场赛 - Wifi Relay的相关文章

【最小瓶颈生成树】【最小生成树】【kruscal】bzoj1083 [SCOI2005]繁忙的都市

本意是求最小瓶颈生成树,但是我们可以证明:最小生成树也是最小瓶颈生成树(其实我不会).数据范围很小,暴力kruscal即可. 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 struct Edge{int u,v,w;void Read(){scanf("%d%d%d",&u,&v,&w);}}edges[10001]; 5 bool operator &

POJ 1861 ——Network——————【最小瓶颈生成树】

Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15268   Accepted: 5987   Special Judge Description Andrew is working as system administrator and is planning to establish a new network in his company. There will be N hubs in the c

HDU 4081Qin Shi Huang&amp;#39;s National Road System(最小生成树+最小瓶颈路)

 题意:秦始皇要修路.把N个城市用N-1条边连通.且他希望花费最小,可是这时候有一个多管闲事的道士出来说他有魔法能够帮助秦始皇变成一条路.可是仅仅能变出一条. 可是.两个人对修路的法案存在歧义,道士希望修路能够给很多其它的百姓带来福利.而秦始皇希望修路要尽量使花费小.最后,秦始皇拿出了一个公式A/B.A表示两个城市的人数,B表示出了用魔法变出来的路外.最短的总距离. 如今要你求出A/B的最大值. 思路:枚举连接哪两个城市.由于这条边是免费的.我们要求算上这条边的最小生成树.假设每次都求一次最

uva(11354) 最小瓶颈生成树+LCA

求出最小生成树后lca找最大权即可 #include<cstdio>#include<algorithm>#include<cstring>using namespace std; struct my{   int v;   int next;   int dist;}; struct node{   int x,y;   int dist;   bool operator <(const node& rhs) const {      return di

算法导论思考题 - 瓶颈生成树

列思路,以后填坑. a. 证明:最小生成树是瓶颈生成树 证略 b. 给定图G和整数b,线性时间内判断瓶颈生成树T值是否不超过b 解:DFS或BFS遍历图G,跳过所有权值大于b的边,最后若有节点未遍历到,则T值大于b,否则不超过b c. 求瓶颈生成树T值 1. 求出边权值的中位数(类似于求nth element一类问题)M,以此将图G的边按权值分成两部分,一部分小于等于M,另一部分大于M 2. 利用b提出的方法判断图G瓶颈生成树的T值是否不超过M,也就是看这个T值位于大小哪半边 3. 若位于小半边

P2502 [HAOI2006]旅行 - 最小生成树【最小比值生成树(雾】

P2502 [HAOI2006]旅行 Sol: 暴力 枚举所有从S到T的路径,然后用maxw/minw更新答案. 时间复杂度:\(O(玄学)\) 正解 观察到边数\(m\leq5000\) 考虑由直接求maxw和minw -> 枚举minw求maxw 由于从S到T的路径上的最大值最小的边一定在最小生成树上(最小生成树的瓶颈路性质),所以我们可以将边从小到大排序,每次枚举边\(e_i\),并将剩下的\(e_i,e_{i+1}\dots e_m\)建最小生成树,当边\(e_k\)使S和T第一次连通时

UVa1395&amp;POJ3522--Slim Span【kruskal】瓶颈生成树

链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4141 题意:给出n个顶点,m条边,求一个生成树,使得最大边与最小边的差值最小. 思路:求一个生成树使最大边最小是瓶颈生成树.对于此题,我们枚举每一条边做最小边的情况,找对应的最小生成树的最大边,找出最大边与最小边差值最小的值即可. #include<cstring> #in

最小瓶颈路与次小生成树

简介: 最小生成树是图论里面一类经典问题,可以有很多种变形,其中最小瓶颈路和次小生成树就是两种比较经典的变形.最小瓶颈路就是在两个结点之间求一条最长边最短的路径,而次小生成树则是所有生成树中权值排名第二的生成树(可以和最小生成树相等).下面我们分别来看看这两个问题. 最小瓶颈路: 给定一个加权无向图,并给定无向图中两个结点u和v,求u到v的一条路径,使得路径上边的最大权值最小.这个问题可以稍微加强一下,即求很多对结点之间的最小瓶颈路. 无向图中,任意两个结点的最小瓶颈路肯定在最小生成树上.因此,

HDU5697 刷题计划 dp+最小乘积生成树

分析:就是不断递归寻找靠近边界的最优解 学习博客(必须先看这个): 1:http://www.cnblogs.com/autsky-jadek/p/3959446.html 2:http://blog.csdn.net/u013849646/article/details/51524748 注:这里用的最小乘积生成树的思想,和dp结合 每次找满足条件的最优的点,只不过BZOJ裸题的满足条件是形成一棵树 这个题是大于m,生成树借用最小生成树进行求解最优,大于m用dp进行求解最优 #include