题目描述

给定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的更多相关文章

  1. P2212 [USACO14MAR]浇地Watering the Fields

    P2212 [USACO14MAR]浇地Watering the Fields 题目描述 Due to a lack of rain, Farmer John wants to build an ir ...

  2. 洛谷——P2212 [USACO14MAR]浇地Watering the Fields

    P2212 [USACO14MAR]浇地Watering the Fields 题目描述 Due to a lack of rain, Farmer John wants to build an ir ...

  3. 洛谷 P2212 [USACO14MAR]浇地Watering the Fields 题解

    P2212 [USACO14MAR]浇地Watering the Fields 题目描述 Due to a lack of rain, Farmer John wants to build an ir ...

  4. BZOJ3479: [Usaco2014 Mar]Watering the Fields

    3479: [Usaco2014 Mar]Watering the Fields Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 81  Solved: ...

  5. BZOJ 3479: [Usaco2014 Mar]Watering the Fields( MST )

    MST...一开始没注意-1结果就WA了... ---------------------------------------------------------------------------- ...

  6. bzoj 3479: [Usaco2014 Mar]Watering the Fields

    3479: [Usaco2014 Mar]Watering the Fields Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 174  Solved ...

  7. (寒假集训)Watering the Fields (最小生成树)

    Watering the Fields 时间限制: 1 Sec  内存限制: 64 MB提交: 26  解决: 10[提交][状态][讨论版] 题目描述 Due to a lack of rain, ...

  8. 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 ...

  9. luogu题解 P2212 【浇地Watering the Fields】

    题目链接: https://www.luogu.org/problemnew/show/P2212 思路: 一道最小生成树裸题(最近居然变得这么水了),但是因为我太蒻,搞了好久,不过借此加深了对最小生 ...

  10. 洛谷 P2212 [USACO14MAR]浇地Watering the Fields

    传送门 题解:计算欧几里得距离,Krusal加入边权大于等于c的边,统计最后树的边权和. 代码: #include<iostream> #include<cstdio> #in ...

随机推荐

  1. linux:day01 计算机基础 随堂笔记 马

    本课程内容目录(前30天) 一,计算机基础 1,机械硬盘是比较慢的,如果有条件的话,还是换成固态硬盘有个120G就够了,价钱大概500G 700元 2,视频从一台机器拷贝到另外一台机器,复制的时候要限 ...

  2. 解决 http://www.diamond-sh.com/favicon.ico 404 (Not Found) 报错问题

    html5页面中经常会遇到这个报错,解决方法有以下两种: 1. 根目录下建一个个favicon.ico文件,在head标签引入favicon.ico文件即可 <link href="f ...

  3. 网络很慢mtu设置

    [root@db-***** etc]# cat /etc/rc.local #!/bin/sh # # This script will be executed *after* all the ot ...

  4. java基于ssm开发的宠物商城宠物店源码

    简介 关于宠物的商店,首页,搜索商品,详情页,可选择尺寸,衣服颜色,根据不同规格显示不同的商品价格,加入购物车,立即购买,评价列表展示,商品详情展示,商品评分,分类商品,标签查询,更多分类查询 演示视 ...

  5. sql server 与mysql差异(innodb)

    MySQL SQL SERVER CHAR_LENGTH(str) LEN(character_expression) CONCAT(str1,str2,...) str1+str2 INSERT(s ...

  6. SVN创建自己的版本库

    1.创建版本库 第一:新建文件夹 第二:将新建文件与SVN建立关联(创建版本库) 直接选择OK 点击确定后文件夹图标也换了 该下的信息就是用来协助我们存储数据的(不是数据) 2.获取SVN库中的数据并 ...

  7. TexturePacker基本使用

    生成后

  8. eclipse的快捷键都有哪些

    非常实用的快捷键 Ctrl+D: 删除当前行 Ctrl+Alt+↓: 复制当前行到下一行 Ctrl+Alt+↑: 复制当前行到上一行 Alt+↓: 当前行和下面一行交互位置 Alt+↑: 当前行和上面 ...

  9. 6. C语言bool类型

    C89没有定义布尔类型,所以C语⾔判断真假时以0为假,⾮0为真.所以我们通常使⽤逻辑变量的做法: 1 //宏定义布尔类型 2 3 #define BOOL int 4 5 #define TRUE 1 ...

  10. window.open在打开pdf时直接下载而不是查看

    一般这是url请求的原因导致的, 可以考虑这种写法 window.open(link+'?response-content-type=application/pdf') 加上后面这段可以转为查看