poj_2349 Kruskal 最小生成树
题目大意
给定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 最小生成树相关推荐
- 数据结构---Kruskal最小生成树
数据结构-Kruskal最小生成树 原理:参考趣学数据结构 代码: 快速排序: #pragma once #define elemType int typedef struct vER {elemTy ...
- 技术图文:如何利用C# 实现 Kruskal 最小生成树算法?
背景 以前我写过一些图文来介绍有关数据结构与算法的知识: 8大排序算法之:直接插入排序(Straight Insertion Sort) 8大排序算法之:希尔插入排序(Shell Insertion ...
- hdu 1233 还是畅通工程 Kruskal 最小生成树 并查集
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1233 模板题,kruskal求最小生成树. 并查集是个好东西啊 就是注意一点 输入边的信息时,角标 ...
- LeetCode 1489. 找到最小生成树里的关键边和伪关键边(并查集+kruskal最小生成树)
文章目录 1. 题目 2. 解题 1. 题目 给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1 ,同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, w ...
- poj 2031Building a Space Station(几何判断+Kruskal最小生成树)
1 /* 2 最小生成树 + 几何判断 3 Kruskal 球心之间的距离 - 两个球的半径 < 0 则说明是覆盖的!此时的距离按照0计算 4 */ 5 #include<iostream ...
- 浅谈Prim,Kruskal最小生成树算法
由于学的最小生成树比较浅显,所写的文章可能也比较粗略,跪求大佬能指导. 首先先了解生成树的概念,什么是生成树呢?生成树可不是树,而是包含图中全部顶点的极小连通子图罢了,就是长得像棵树,而且在生成树中添 ...
- vijos P1190繁忙的都市(Kruskal)(最小生成树)
P1190 繁忙的都市 城市C是一个非常繁忙的大都市,城市 中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉 ...
- 东哥带你刷图论第五期:Kruskal 最小生成树算法
学算法认准 labuladong 点击卡片可搜索关键词
- 7-3 最小生成树-kruskal (10 分)(思路+详解+并查集详解+段错误超时解决)宝 Come
一:前言 本题需要用到并查集的知识,建议先学完并查集后再看看本题 二:题目 题目给出一个无向连通图,要求求出其最小生成树的权值. 温馨提示:本题请使用kruskal最小生成树算法. 输入格式: 第一行 ...
最新文章
- DIY一个高大上带提醒的计时器,简单实用,你还在等什么
- 一个计算机爱好者的不完整回忆(二十八)关于计算机书籍
- 常用查找算法(顺序、折半、二叉树、哈希、分块)介绍
- ARM 编译选项的默认关系 001
- 两周内股指见底概率大
- c51转汇编语言窗口,在C51语言中如何嵌入汇编语言
- 一个很酷的SilverLight例子
- 禅智听书《精进:如何成为一个很厉害的人》
- 弹出登录框 您未被授权查看该页 的解决办法
- Ubuntu安装cuckoo布谷鸟沙箱详细步骤
- 治疗便秘的30种秘方
- vue根据获取的文件名显示文件服务器上的图片
- 《连线》长文特写李飞飞:已识乾坤大,犹怜草木青
- ctcpejmu单词_微生物英文单词
- python与分形0017 - 【教程】彩色色阶蛛网
- Java8新特性之Stream流式编程
- android_rooting_tools 项目介绍(CVE-2012-4220)
- Python实现头像换脸(AI换脸)
- 309.Best Time to Buy and Sell Stock with Cooldown
- Python几种常用的数据导入方法
热门文章
- 事物与持久化_揭开Redis面纱,发布订阅、事务、安全、持久化
- php采集一言代码_PHP简单实现一言 / 随机一句功能
- 【阿里云OSS】OSS概述
- js模块化:默认导出 export default
- mysql置疑原因_SQLSERVER数据库经常置疑的原因
- 元素周期表排列的规律_元素周期表诞生150周年,这些有趣的元素性质你都知道吗?...
- mysql 字符串中取整_MySQL取整
- jena fuseki RDF应用
- Python最佳代码实践:性能、内存和可用性!
- 卧槽,别人家的黑客增长!