博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
A - Buy or Build UVA - 1151
阅读量:4113 次
发布时间:2019-05-25

本文共 949 字,大约阅读时间需要 3 分钟。

题意:给你n个点和一些集合,在集合中的点是相互联通的,现在需要修建一些路使得n个点相互联通,其中每条路你可以修建也可以买,如果修建的话花费是两个点之间的欧几里得距离,其中点是在二维坐标中。每个点的位置都给出了,如果要修建的这条边在某个集合中,你也可以选择把这个集合买下来,每个集合的花费也给出了。

思路:先根据每个点的最坐标求出两点之间的欧几里得距离,再在每两点之间修建道路,先不买任何集合求出此时最小的花费,此时就是求图的最小生成树,然后在二进制枚举,因为已经告诉你集合的个数不超过8个,所以可以进行二进制枚举,看买那些边,如果要是买下其中一些集合的话,使用并查集把这些点都加到一起。然后在根据把边加到一起之后在求最小生成树,这时求最小生成树时就爱直接根据不买任何集合时的最小生成树求,因为求最小的花费所使用的肯定是最小生成树里的一些边。

#include 
using namespace std;const int maxn=1e6+50;int n,m;int cnt;int c;struct Point{ int x,y;} p[maxn];struct Node{ int x,y,w;} node[maxn],mst[maxn];struct Team{ int val,num; int v[maxn];} sub[10];int fa[maxn];void Init(){ for(int i=0; i<=n; i++) fa[i]=i;}long long int Dig(int x,int y){ long long int xx=p[x].x-p[y].x; long long int yy=p[x].y-p[y].y; return (long long int)(xx*xx+yy*yy);}int Find_x(int x){ return fa[x]=(x==fa[x]?x:Find_x(fa[x]));}long long int solve(){ long long int res=0; for(int i=0; i
0) cout<

转载地址:http://mfgsi.baihongyu.com/

你可能感兴趣的文章
DirectX11 光照演示示例Demo
查看>>
VUe+webpack构建单页router应用(一)
查看>>
Node.js-模块和包
查看>>
(python版)《剑指Offer》JZ01:二维数组中的查找
查看>>
Spring MVC中使用Thymeleaf模板引擎
查看>>
PHP 7 的五大新特性
查看>>
深入了解php底层机制
查看>>
PHP中的stdClass 【转】
查看>>
XHProf-php轻量级的性能分析工具
查看>>
OpenCV gpu模块样例注释:video_reader.cpp
查看>>
OpenCV meanshift目标跟踪总结
查看>>
就在昨天,全球 42 亿 IPv4 地址宣告耗尽!
查看>>
听说玩这些游戏能提升编程能力?
查看>>
如果你还不了解 RTC,那我强烈建议你看看这个!
查看>>
沙雕程序员在无聊的时候,都搞出了哪些好玩的小玩意...
查看>>
Mysql复制表以及复制数据库
查看>>
Kafka
查看>>
9.1 为我们的角色划分权限
查看>>
维吉尼亚之加解密及破解
查看>>
TCP/IP协议三次握手与四次握手流程解析
查看>>