P2212 Watering the Fields S
题目描述
给定n个点,第i个点的坐标为(xi,yi)(xi,yi),如果想连通第i个点与第j个点,需要耗费的代价为两点的距离。第i个点与第j个点之间的距离使用欧几里得距离进行计算,即:(xi-xj)2+(yi-yj)2
我们规定耗费代价小于c的两点无法连通,求使得每两点都能连通下的最小代价,如果无法连通输出-1。
输入格式
第一行两个整数n,c代表点数与想要连通代价不能少于的一个数。
接下来n行每行两个整数xi,yi描述第i个点。
输出格式
一行一个整数代表使得每两点都能连通下的最小代价,如果无法连通输出 -1。

数据规模
1≤n≤2000,0≤xi,yi≤1000,1≤c≤106。
思路:
既然我们想要让这张图中的每两个点之间都能联通,那么这道题很明显就是一道使用最小生成树解决的问题。我们一共有最多2000个点,所以我们可以枚举每两个点之间的距离,然后判断距离是否满足≥c的条件。如果满足,则我们将这条边存储下来。
这里存储边我们仍然使用结构体存储起点、终点和边权的方法。
接下来我们还是要对边依照边权从小到大进行排序。
最后我们只需要跑一遍克鲁斯卡尔算法即可。
完整代码:
1 #include<iostream>
2 #include<algorithm>
3 using namespace std;
4 int n,c;
5 struct dian{
6 int x,y;
7 }a[2005];
8 int fa[2005];
9 struct bian{
10 int start;
11 int end;
12 int dis;
13 }b[4000005];
14 bool cmp(bian a,bian b){
15 return a.dis<b.dis;
16 }
17 int find(int x){
18 if(x==fa[x]){
19 return x;
20 }else{
21 return fa[x]=find(fa[x]);
22 }
23 }
24 void unionn(int x,int y){
25 int r1=find(x);
26 int r2=find(y);
27 fa[r1]=r2;
28 }
29 int main(){
30 cin>>n>>c;
31 for(int i=1;i<=n;i++){
32 cin>>a[i].x>>a[i].y;
33 }
34 int cnt=1;
35 for(int i=1;i<=n;i++){
36 for(int j=i+1;j<=n;j++){
37 if((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)>=c){
38 b[cnt].start=i;
39 b[cnt].end=j;
40 b[cnt].dis=(a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y);
41 cnt++;
42 }
43 }
44 }
45 cnt--;
46 sort(b+1,b+cnt+1,cmp);
47 for(int i=1;i<=n;i++){
48 fa[i]=i;
49 }
50 int sum=0;//统计加入连通图的点数
51 int ans=0;//统计最小代价
52 for(int i=1;i<=cnt;i++){
53 if(find(b[i].start)!=find(b[i].end)){
54 sum++;
55 ans+=b[i].dis;
56 unionn(b[i].start,b[i].end);
57 }
58 if(sum==n-1){
59 break;
60 }
61 }
62 if(sum<n-1){
63 cout<<-1<<endl;
64 }else{
65 cout<<ans<<endl;
66 }
67 return 0;
68 }
这里要注意一点:两点间的距离在题目的定义中是直接的平方和,所以我们不需要使用double,但同时我们也要注意应当让边权直接与c比较,在比较时也不必对c取平方。
P2212 Watering the Fields S的更多相关文章
- P2212 [USACO14MAR]浇地Watering the Fields
P2212 [USACO14MAR]浇地Watering the Fields 题目描述 Due to a lack of rain, Farmer John wants to build an ir ...
- 洛谷——P2212 [USACO14MAR]浇地Watering the Fields
P2212 [USACO14MAR]浇地Watering the Fields 题目描述 Due to a lack of rain, Farmer John wants to build an ir ...
- 洛谷 P2212 [USACO14MAR]浇地Watering the Fields 题解
P2212 [USACO14MAR]浇地Watering the Fields 题目描述 Due to a lack of rain, Farmer John wants to build an ir ...
- BZOJ3479: [Usaco2014 Mar]Watering the Fields
3479: [Usaco2014 Mar]Watering the Fields Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 81 Solved: ...
- BZOJ 3479: [Usaco2014 Mar]Watering the Fields( MST )
MST...一开始没注意-1结果就WA了... ---------------------------------------------------------------------------- ...
- bzoj 3479: [Usaco2014 Mar]Watering the Fields
3479: [Usaco2014 Mar]Watering the Fields Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 174 Solved ...
- (寒假集训)Watering the Fields (最小生成树)
Watering the Fields 时间限制: 1 Sec 内存限制: 64 MB提交: 26 解决: 10[提交][状态][讨论版] 题目描述 Due to a lack of rain, ...
- P2212 [USACO14MAR]浇地Watering the Fields 洛谷
https://www.luogu.org/problem/show?pid=2212 题目描述 Due to a lack of rain, Farmer John wants to build a ...
- luogu题解 P2212 【浇地Watering the Fields】
题目链接: https://www.luogu.org/problemnew/show/P2212 思路: 一道最小生成树裸题(最近居然变得这么水了),但是因为我太蒻,搞了好久,不过借此加深了对最小生 ...
- 洛谷 P2212 [USACO14MAR]浇地Watering the Fields
传送门 题解:计算欧几里得距离,Krusal加入边权大于等于c的边,统计最后树的边权和. 代码: #include<iostream> #include<cstdio> #in ...
随机推荐
- 路由器、集线器、交换机分别工作在OSI七层协议模型的哪一层
路由器三层(网络层): 集线器一层(物理层): 普通交换机二层(数据链路层). 现在也有工作在第三层的交换机. OSI七层网络模型由下至上为1至7层,分别为物理层(Physical layer),数据 ...
- VIM的撤销与恢复设置行数
vim撤销操作:u vim恢复操作:ctrl+r 设置行数: :set nu
- notepad++设置
1.背景颜色 [设置]-[语言格式设置] 选择主题:Solarized-light
- 记一个在线工具网站,程序员必备,json格式化、压缩、转义,加解密 编码解码
简用-在线工具箱-简单易用-工具大全 提供 json格式化,json代码压缩,json校验解析,json数组解析,json转xml,xml转json,json解析,json在线解析,json在线解析及 ...
- 接口拿到的id和传到后台的id不一致,导致查询详情和编辑报错
碰到这个问题真是百思不得其解.接口上打印的值和数据库一致,浏览器查看response的反馈也一致.但是一在页面打印请求回来的值,就变了,变成了另一个id,但是其他数据又和数据库一致. 查了一圈也没有查 ...
- select,poll和epoll使用场景和区别
阻塞I/O至I/O多路复用 阻塞I/O指进程发起调用后会被挂起(阻塞),直到收到数据再返回.如果调用一直不返回,进程就一直被挂起.因此,使用阻塞I/O需要利用多线程来处理多个文件描述符. 引入非阻塞I ...
- MySQL查询时记录行号rownum MySQL查询显示行号MySQL查询显示行号MySQL流水号自MySQL自增行号
MySQL查询时记录行号rownum MySQL查询显示行号MySQL查询显示行号MySQL流水号自MySQL自增行号 一.前言 Oracle中有rownum,实现查询的时候记录行号,MySQL中没有 ...
- 【SQL Server】存储过程带参数输出——output
在SQL Server 中,如果要用一个存储过程返回字符串应该怎么做?用output参数. 错误方式 接下来,展示一下,常见的错误方法 CREATE PROCEDURE testString AS B ...
- Qt中资源文件qrc中的路径访问
首先先看一下我们的qrc文件目录结构: 在文件系统中的目录结构是这样的: 请务必注意这边的前缀(按照网友推荐,大部分项目前缀都是只写一个"/"): 接下来进入正题,我们来分 ...
- JS篇(007)-事件委托是什么
答案:利用事件冒泡的原理,让自己的所触发的事件,让他的父元素代替执行! 解析: 1.那什么样的事件可以用事件委托,什么样的事件不可以用呢? 适合用事件委托的事件:click,mousedown,mou ...