USACO 07DEC 道路建设(Building Roads)
Farmer John had just acquired several new farms! He wants to connect the farms with roads so that he can travel from any farm to any other farm via a sequence of roads; roads already connect some of the farms.
Each of the N (1 ≤ N ≤ 1,000) farms (conveniently numbered 1..N) is represented by a position (Xi, Yi) on the plane (0 ≤ Xi ≤ 1,000,000; 0 ≤ Yi ≤ 1,000,000). Given the preexisting M roads (1 ≤ M ≤ 1,000) as pairs of connected farms, help Farmer John determine the smallest length of additional roads he must build to connect all his farms.
Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场)。有些农场之间原本就有道路相连。 所有N(1 <= N <= 1,000)个农场(用1..N顺次编号)在地图上都表示为坐标为(X_i, Y_i)的点(0 <= X_i <= 1,000,000;0 <= Y_i <= 1,000,000),两个农场间道路的长度自然就是代表它们的点之间的距离。现在Farmer John也告诉了你农场间原有的M(1 <= M <= 1,000)条路分别连接了哪两个农场,他希望你计算一下,为了使得所有农场连通,他所需建造道路的最小总长是多少。
输入格式
* Line 1: Two space-separated integers: N and M
* Lines 2..N+1: Two space-separated integers: Xi and Yi
* Lines N+2..N+M+2: Two space-separated integers: i and j, indicating that there is already a road connecting the farm i and farm j.
第1行: 2个用空格隔开的整数:N 和 M
第2..N+1行: 第i+1行为2个用空格隔开的整数:X_i、Y_i
第N+2..N+M+2行: 每行用2个以空格隔开的整数i、j描述了一条已有的道路, 这条道路连接了农场i和农场j
输出格式
* Line 1: Smallest length of additional roads required to connect all farms, printed without rounding to two decimal places. Be sure to calculate distances as 64-bit floating point numbers.
输出使所有农场连通所需建设道路的最小总长,保留2位小数,不必做 任何额外的取整操作。为了避免精度误差,计算农场间距离及答案时 请使用64位实型变量
输入输出样例
输入 #14 1
1 1
3 1
2 3
4 3
1 4输出 #14.00说明/提示
题目简述:给出n个点的坐标,其中一些点已经连通,现在要把所有点连通,求修路的最小长度.
(来自洛谷)
因为要求把所有的点联通的最小长度,直接求最小生成树。
至于一部分已经修好的路径,既然不用再修(肯定在树内且无需计权值),对于每条路直接添加一条权值为0的边即可。
我用了一个vector存储路径,每次穷举两个点求欧几里得距离插入边,最后加入那些0权值边后Kruskal算法直接解决。
#include <bits/stdc++.h>
using namespace std;
int m, n;
double rslt;
double posx[], posy[];
struct edge{
int from, to;
double val;
};
vector <edge> g;
int edge_cnt;
bool cmp(const edge &x, const edge &y){
if(x.val == y.val){
if(x.from == y.from) return x.to < y.to;
return x.from < y.from;
}
return x.val < y.val;
}
void add_edge(int f, int t, double v){
g.push_back((edge){f, t, v});
g.push_back((edge){t, f, v});
edge_cnt += ;
} int father[];
int find(int x){
if(father[x] != x) father[x] = find(father[x]);
return father[x];
} void add_place(){
for(int i=; i<n; i++){
for(int j=i+; j<=n; j++){
double len = (double)sqrt((double)(posx[i] - posx[j]) * (posx[i] - posx[j]) + (double)(posy[i] - posy[j]) * (posy[i] - posy[j]));
add_edge(i, j, len);
}
}
return;
} void kruskal(){
for(int i=; i<n; i++){
father[i] = i;
}
sort(g.begin(), g.end(), cmp);
int cnt;
for(int i=; i<edge_cnt; i++){
int f1 = find(g[i].from), f2 = find(g[i].to);
if(f1 != f2){
rslt += g[i].val;
father[f1] = f2;
if(++cnt == n-) return;
}
} } int main(){
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
cin >> n >> m;
for(int i=; i<=n; i++){
cin >> posx[i] >> posy[i];
}
add_place();
for(int i=; i<m; i++){
int f, t;
cin >> f >> t;
add_edge(f, t, );
}
kruskal();
printf("%.2f", rslt);
return ;
}
USACO 07DEC 道路建设(Building Roads)的更多相关文章
- bzoj1626 / P2872 [USACO07DEC]道路建设Building Roads
P2872 [USACO07DEC]道路建设Building Roads kruskal求最小生成树. #include<iostream> #include<cstdio> ...
- 洛谷——P2872 [USACO07DEC]道路建设Building Roads
P2872 [USACO07DEC]道路建设Building Roads 题目描述 Farmer John had just acquired several new farms! He wants ...
- 洛谷 P2872 [USACO07DEC]道路建设Building Roads 题解
P2872 [USACO07DEC]道路建设Building Roads 题目描述 Farmer John had just acquired several new farms! He wants ...
- 洛谷 P2872 [USACO07DEC]道路建设Building Roads
题目描述 Farmer John had just acquired several new farms! He wants to connect the farms with roads so th ...
- 题解 P2872 【[USACO07DEC]道路建设Building Roads】
这道题真的是令人窒息,Kruskal调了贼久一直RE,最后发现数组大小稍微少了那么一点点.(也就10倍吧..) 言归正传,根据本人的分析(以及算法标签的提示),这是一道求最小生成树的题目,当然要注意已 ...
- $P2872\ [USACO07DEC]道路建设Building\ Roads$
\(problem\) 错的原因是\(RE\)(大雾 , 时刻谨记 \(N\) 个地方的话 保守开 \(\frac{N^2}{2}\) 大小. 因为是边. 边最多的情况即完全图 : $1+2+3+4. ...
- [USACO07DEC]道路建设Building Roads
题目:洛谷P2872.POJ3625. 题目大意:给你n个点的坐标,有些点已经有边连通,现在要你连上剩下的所有点,求这些边的最小长度是多少(不包括原来的边). 解题思路:最小生成树,把所有边处理出来, ...
- 洛谷 P2872 【[USACO07DEC]道路建设Building Roads】
P2872 传送门 首先 题目概括:题目让着求使所有牧场都联通.需要修建多长的路. 显然这是一道最小生成树板子题(推荐初学者做). 那我就说一下kruskal吧. Kruskal算法是一种用来查找最小 ...
- USACO Building Roads
洛谷 P2872 [USACO07DEC]道路建设Building Roads 洛谷传送门 JDOJ 2546: USACO 2007 Dec Silver 2.Building Roads JDOJ ...
随机推荐
- yzoj P2371 爬山 题解
背景 其实 Kano 曾经到过由乃⼭,当然这名字⼀看⼭主就是 Yuno 嘛.当年 Kano 看见了由乃⼭,内⼼突然涌出了⼀股杜甫会当凌绝顶,⼀览众⼭⼩的 豪⽓,于是毅然决定登⼭.但是 Kano 总是习 ...
- Java 学习笔记之 父子类Synchronized
父子类Synchronized: 我们通过一个例子来验证下,父类和子类的Synchronized方法被同时调用,是否是同步的. public class FatherClass { synchroni ...
- web前端之面试:自我介绍
面试官您好, 首先很感谢贵公司的面试邀请, 让我有这个幸运机会能来到这里和您交流 : 接下来我做一个简单的自我介绍: 我的姓名是 XX, 祖籍是XX, 年龄是24, 学校是 XXX, 专业是XXX: ...
- HTML input 文本框输入中文逗号自动转换为英文逗号
input 标签中增加 onkeyup.onafterpaste 属性: <input type="text"placeholder="中文逗号自动转换为英文逗号& ...
- Solidity 编程实例--投票
Voting 投票 思路是为每张选票创建一个合约,每个投票选项提供一个短名称.合约创建者作为会长将会给每个投票参与人各自的地址投票权. 地址后面的人们可以选择自己投票或者委托信任的代表人替他们投票.在 ...
- mac下安装jmeter
jmeter官网下载 双击解压 命令行进入/Users/yanguobin/apache-jmeter-5.1.1/bin目录下,输入sh jmeter即可启动 也可以 配置环境变量 vim ~/.b ...
- Faker——生成测试数据的PHP类库
工作上用的是TP框架,每次测试功能的时候都要手动添加测试数据,词穷起名总是起一些test1.test2这种low到爆炸的用户名,这让我很难受.稍微翻阅了一些资料,发现laravel有一个生成测试数据的 ...
- API---注册表编程
首先来认识一下键,项,值吧: 左边有五个根键: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USER HKEY_CURREN ...
- java集合之linkedList链表基础
LinkedList链表: List接口的链接列表实现.允许存储所有元素(包含null).使用频繁增删元素. linkedList方法: void addFirst(E e) 指定元素插入列表的开头 ...
- 使用Docker搭建apache环境
Docker搭建apache环境 前言 操作机:ubuntu16 x64 Dockers servion 18.09.7 下载镜像 使用docker pull 拉取最新的 apache镜像 命令:do ...