题目大意

给定N个点的坐标,这N个点之间需要进行通讯。通讯方式可以采用卫星通信或无线通信,若两点之间采用为卫星通信,则两点之间的距离无限制,若采用无线通讯,则两点之间的距离不能大于某个值D。 
    现有s台卫星通信设备可以分配给这N个点,其余的点之间必须使用无线通信。要让这N个点中所有的点都能相互通信,则合理分配s台卫星通信设备,可以使得采用无线通信的那些点之间的距离D达到一个最小值,求该最小值。

题目分析

让所有的点之间均能通信,为一个生成树结构。题目就是求出这N个点的最小生成树。然后将最小生成树分成S个割集,割集之间采用卫星通信,割集之内采用无线通信,求出割集之内点之间的最大值即可。 
    可以证明,割集之内的点距离的最大值的最小值为最小生成树的N-1条边从大到小排列后第S个边长。采用kruskal算法解决。

实现(c++)

#include<stdio.h>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
#define MAX_NODE 505
//点的数据结构
struct Point{int x;int y;
};
vector<Point> gPoints;//边的数据结构
struct Edge{int from;int to;double dist;Edge(int f, int t, double d) :from(f), to(t), dist(d){};
};
vector<Edge> gEdges;//计算两点之间的距离
double Dist(const Point& p1, const Point& p2){return sqrt(1.0*(p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y));
}//用并查集来判断加入一条边是否会构成环
int gRoot[MAX_NODE];
int GetRoot(int c){if (gRoot[c] != c){gRoot[c] = GetRoot(gRoot[c]);}return gRoot[c];
}
bool SameRoot(int c1, int c2){int p1 = GetRoot(c1);int p2 = GetRoot(c2);return p1 == p2;
}void Union(int c1, int c2){int p1 = GetRoot(c1);int p2 = GetRoot(c2);gRoot[p1] = p2;
}
//用于对边进行排序
bool Compare(const Edge& e1, const Edge& e2){return e1.dist < e2.dist;
}double Kruskal(int s, int n){double result;for (int i = 0; i < n; i++){gRoot[i] = i;}sort(gEdges.begin(), gEdges.end(), Compare); //无向图的边只存储了 从序号较小的节点指向序号较大的节点int count = 0;for (int i = 0; i < gEdges.size(); i++){Edge& e = gEdges[i];if (SameRoot(e.from, e.to))continue;count++;if (count == n - s){ //从最小生成树中的n-1条边,去掉最大的s-1条边(因为有s个卫星站,相当于s个点,则s-1条边)//,剩下的n-1-s条边中,最大的边长即为所求result = e.dist;return result;}Union(e.to, e.from);//gRoot[gRoot[e.to]] = gRoot[e.from]; //注意合并的时候,将 to 的根更新为 from的根。因为所有的边只存储了从小序号指向大序号}return 0;
}int main(){int cas, s, p;Point point;scanf("%d", &cas);while (cas--){scanf("%d %d", &s, &p);gEdges.clear();gPoints.clear();for (int i = 0; i < p; i++){scanf("%d %d", &point.x, &point.y);for (int j = 0; j < i; j++){double dist = Dist(point, gPoints[j]);gEdges.push_back(Edge(j, i, dist));}gPoints.push_back(point);}double result = Kruskal(s, p);printf("%.2lf\n", result);}return 0;
}

转载于:https://www.cnblogs.com/gtarcoder/p/4867404.html

poj_2349 Kruskal 最小生成树相关推荐

  1. 数据结构---Kruskal最小生成树

    数据结构-Kruskal最小生成树 原理:参考趣学数据结构 代码: 快速排序: #pragma once #define elemType int typedef struct vER {elemTy ...

  2. 技术图文:如何利用C# 实现 Kruskal 最小生成树算法?

    背景 以前我写过一些图文来介绍有关数据结构与算法的知识: 8大排序算法之:直接插入排序(Straight Insertion Sort) 8大排序算法之:希尔插入排序(Shell Insertion ...

  3. hdu 1233 还是畅通工程 Kruskal 最小生成树 并查集

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1233 模板题,kruskal求最小生成树. 并查集是个好东西啊  就是注意一点 输入边的信息时,角标 ...

  4. LeetCode 1489. 找到最小生成树里的关键边和伪关键边(并查集+kruskal最小生成树)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1 ,同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, w ...

  5. poj 2031Building a Space Station(几何判断+Kruskal最小生成树)

    1 /* 2 最小生成树 + 几何判断 3 Kruskal 球心之间的距离 - 两个球的半径 < 0 则说明是覆盖的!此时的距离按照0计算 4 */ 5 #include<iostream ...

  6. 浅谈Prim,Kruskal最小生成树算法

    由于学的最小生成树比较浅显,所写的文章可能也比较粗略,跪求大佬能指导. 首先先了解生成树的概念,什么是生成树呢?生成树可不是树,而是包含图中全部顶点的极小连通子图罢了,就是长得像棵树,而且在生成树中添 ...

  7. vijos P1190繁忙的都市(Kruskal)(最小生成树)

    P1190  繁忙的都市 城市C是一个非常繁忙的大都市,城市 中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉 ...

  8. 东哥带你刷图论第五期:Kruskal 最小生成树算法

    学算法认准 labuladong 点击卡片可搜索关键词

  9. 7-3 最小生成树-kruskal (10 分)(思路+详解+并查集详解+段错误超时解决)宝 Come

    一:前言 本题需要用到并查集的知识,建议先学完并查集后再看看本题 二:题目 题目给出一个无向连通图,要求求出其最小生成树的权值. 温馨提示:本题请使用kruskal最小生成树算法. 输入格式: 第一行 ...

最新文章

  1. DIY一个高大上带提醒的计时器,简单实用,你还在等什么
  2. 一个计算机爱好者的不完整回忆(二十八)关于计算机书籍
  3. 常用查找算法(顺序、折半、二叉树、哈希、分块)介绍
  4. ARM 编译选项的默认关系 001
  5. 两周内股指见底概率大
  6. c51转汇编语言窗口,在C51语言中如何嵌入汇编语言
  7. 一个很酷的SilverLight例子
  8. 禅智听书《精进:如何成为一个很厉害的人》
  9. 弹出登录框 您未被授权查看该页 的解决办法
  10. Ubuntu安装cuckoo布谷鸟沙箱详细步骤
  11. 治疗便秘的30种秘方
  12. vue根据获取的文件名显示文件服务器上的图片
  13. 《连线》长文特写李飞飞:已识乾坤大,犹怜草木青
  14. ctcpejmu单词_微生物英文单词
  15. python与分形0017 - 【教程】彩色色阶蛛网
  16. Java8新特性之Stream流式编程
  17. android_rooting_tools 项目介绍(CVE-2012-4220)
  18. Python实现头像换脸(AI换脸)
  19. 309.Best Time to Buy and Sell Stock with Cooldown
  20. Python几种常用的数据导入方法

热门文章

  1. 事物与持久化_揭开Redis面纱,发布订阅、事务、安全、持久化
  2. php采集一言代码_PHP简单实现一言 / 随机一句功能
  3. 【阿里云OSS】OSS概述
  4. js模块化:默认导出 export default
  5. mysql置疑原因_SQLSERVER数据库经常置疑的原因
  6. 元素周期表排列的规律_元素周期表诞生150周年,这些有趣的元素性质你都知道吗?...
  7. mysql 字符串中取整_MySQL取整
  8. jena fuseki RDF应用
  9. Python最佳代码实践:性能、内存和可用性!
  10. 卧槽,别人家的黑客增长!