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 ...
随机推荐
- 【vscode】linux下vscode的使用
注1:vscode在查看project时,非常好用,可以导入整个project并查看其中文件,通过插件的安装还可以实现跳转到当前函数定义处的功能; 注2:可以了解下source insight; 补充 ...
- python学习:窗口程序
https://www.cnblogs.com/zyg123/p/10385456.html # 导入tkinter模块 import tkinter # 创建画布需要的库 from matplotl ...
- BIP弹框内容显示的隐藏
viewModel.on("customInit", function (data) { // 关闭或取消关原因详情--页面初始化 viewMode ...
- 3阶(次)贝塞尔曲线的JavaScript(JS)实现
php中文网数学符号的显示太差了,推荐看这里 贝塞尔曲线简介:贝塞尔曲线,是贝塞尔老爷子在使用电子计算机设计汽车零件的时候 进行曲面设计而采用的一种参数化的样条曲线. 一般参数方程: B(t) = \ ...
- Ubuntu网络重置
Ubuntu网络重置 >重置网络 sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager ...
- 通过EXCEL/WPS文件,拼接SQL,刷数据库数据
WPS如何把日期变成文本格式? [快捷选择同一列多条记录]同一列,鼠标左键标记A,SHIFT+鼠标左键标记B ,等于选择A-B的之间的数据 [向下填充]在第一行输入数据,选择同一列A-B的之间的数据, ...
- css选择器 权重的叠加
- lg8945题解
考虑一个20分的\(O(n^2)\)做法:枚举答案区间\([l,r]\),那么显然要把尽可能多的1填入\([l,r]\).使用前缀和计算\([l,r]\)中\(0\)的个数,那么填入后的价值可以\(O ...
- Java流程控制之DoWhile循环
DoWhile循环 对于while语句而言,如果不满足条件,则不能进入循环.但有时候我们需要即使不满足条件,也至少执行一次. do...while 循环和 while循环相似,不同的是,do...wh ...
- PLSQL REPLACE 函数替换操作
oracle REPLACE 函数是用另外一个值来替代串中的某个值. 例如,可以用一个匹配数字来替代字母的每一次出现. REPLACE 的格式如下: REPLACE ( char, search_st ...