题解 P2872 【[USACO07DEC]道路建设Building Roads】
这道题真的是令人窒息,Kruskal调了贼久一直RE,最后发现数组大小稍微少了那么一点点。(也就10倍吧。。)
言归正传,根据本人的分析(以及算法标签的提示),这是一道求最小生成树的题目,当然要注意已经有一些路被建成了,因此他们直接标0即可。
下面是这道题用到了的所有(全局)变量。
maxn, n, m就不解释了。
x[]和y[]是用来储存农场的坐标的,当然也可以用二维数组写,只是我懒得敲那么多字(说起来差别也不大)。
f是并查集中储存祖先的数组。
如果有不了解的并查集的可以参考这一片讲解,个人认为十分通俗易懂。 传送门
f1和f2是后面暂时储存有道路连接的农场的变量。
top是Kruskal主体中记录最顶层的。
cnt是记录长度的。
ans我觉得也是废话(耶,皮这一下我很开心)。
const int maxn = ; int n, m;
int x[maxn], y[maxn], f[maxn], f1, f2;
int top = , cnt = ;
double ans = ;
接下来是储存两点距离的结构体,以及结构体排序。
struct node {
int x, y;
double val;
}dis[maxn];
bool cmp(node a, node b) {
if(a.val == b.val)
return a.x < b.x;
return a.val < b.val;
}
以及并查集模板(其中find函数使用了路径压缩)
int find(int x) {
int r = x;
while(r != f[r]) r = f[r];
int i = x, j;
while(f[i] != r) {
j = f[i];
f[i] = r;
i = j;
}
return r;
}
void merge(int x, int y) {
x = find(x);
y = find(y);
if(x != y) f[y] = x;
}
偶对了还有最没用的函数dt,用于求两点距离。
double dt(int x1,int x2,int y1,int y2) {
return sqrt(pow(double(x1 - x2), ) + pow(double(y1 - y2), ));
}
接下来果断开始主函数part。
读入数据,别忘了初始化并查集。
cin >> n >> m;
for(int i = ; i <= n; i++) cin >> x[i] >> y[i];
for(int i = ; i <= n; i++) f[i] = i;
for(int i = ; i <= n; i++)
for(int j = i + ; j <= n; j++) {
dis[++cnt].x = i;
dis[cnt].y = j;
dis[cnt].val = dt(x[i], x[j], y[i], y[j]);
}
for(int i = ; i <= m; i++) {
cin >> f1 >> f2;
dis[++cnt].x = f1;
dis[cnt].y = f2;
dis[cnt].val = ;
}
然后给dis排个序。
sort(dis + , dis + cnt + , cmp);
最重要的部分:Kruskal模板
Kruskal算法将图中的每一个顶点视为一个独立的集合,首先将图中所有的边按权值大小从小到大排列,接着按顺序选择每一条边,如果这条边的两个端点不属于同一个集合,那么将它们所在的集合合并,同时将这条边加入E’。直到所有的顶点都属于同一个集合时,E’就是一颗最小生成树。
--摘抄自《ACM国际大学生程序设计竞赛 知识与入门》
for(int i = ; i <= cnt; i++) {
if(find(dis[++top].x) != find(dis[top].y)) {
ans += dis[top].val;
merge(dis[top].x, dis[top].y);
}
}
最后,愉快的输出结果就好了,别忘了要保留两位小数。
题解 P2872 【[USACO07DEC]道路建设Building Roads】的更多相关文章
- 洛谷 P2872 [USACO07DEC]道路建设Building Roads 题解
P2872 [USACO07DEC]道路建设Building Roads 题目描述 Farmer John had just acquired several new farms! He wants ...
- 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
题目描述 Farmer John had just acquired several new farms! He wants to connect the farms with roads so th ...
- $P2872\ [USACO07DEC]道路建设Building\ Roads$
\(problem\) 错的原因是\(RE\)(大雾 , 时刻谨记 \(N\) 个地方的话 保守开 \(\frac{N^2}{2}\) 大小. 因为是边. 边最多的情况即完全图 : $1+2+3+4. ...
- 洛谷 P2872 【[USACO07DEC]道路建设Building Roads】
P2872 传送门 首先 题目概括:题目让着求使所有牧场都联通.需要修建多长的路. 显然这是一道最小生成树板子题(推荐初学者做). 那我就说一下kruskal吧. Kruskal算法是一种用来查找最小 ...
- [USACO07DEC]道路建设Building Roads
题目:洛谷P2872.POJ3625. 题目大意:给你n个点的坐标,有些点已经有边连通,现在要你连上剩下的所有点,求这些边的最小长度是多少(不包括原来的边). 解题思路:最小生成树,把所有边处理出来, ...
- USACO 07DEC 道路建设(Building Roads)
Farmer John had just acquired several new farms! He wants to connect the farms with roads so that he ...
- USACO Building Roads
洛谷 P2872 [USACO07DEC]道路建设Building Roads 洛谷传送门 JDOJ 2546: USACO 2007 Dec Silver 2.Building Roads JDOJ ...
随机推荐
- Android View 上下左右四种间距的设置方法
RecyclerView控件大家肯定不陌生,已经应用有一段时间了,最近在项目中写一个GridLayout样式的RecyclerView时需要设置,item之间左右的间距,下面是我总结的一个设置间距的方 ...
- Angular4集成ng2-file-upload
在Github上找到了一个支持Angular4好用的文件上传组件ng2-file-upload,这里简单介绍一下这个库的集成使用方案. 本文基于该组件的1.2.1版. 1. 安装 安装非常简单, ...
- Codeforces 986B. Petr and Permutations(没想到这道2250分的题这么简单,早知道就先做了)
这题真的只能靠直觉了,我没法给出详细证明. 解题思路: 1.交换3n次或者7n+1次,一定会出现一个为奇数,另一个为偶数. 2.用最朴素的方法,将n个数字归位,计算交换次数. 3.判断交换次数是否与3 ...
- 《汇编语言(第三版)》cmp指令
# cmp指令 本质 cmp是比较指令,cmp的功能相当于减法. 格式 cmp 操作对象1,操作对象2 功能 计算操作对象1-操作对象2,但并不保存结果,可以根据flag标志寄存器来判断结果. 正向判 ...
- C#多播委托和事件的区别与关系
事件是对委托的封装. 如果一个类里,你把一个委托声明为 public 了,那么外部就可以随意改变委托变量的值,包括清空委托变量等,这样的话就违背了面向对象思想的封装特性:但如果声明为 private ...
- Debian/Linux 下无线网卡驱动的安装
我的 PC 型号是 Acer V3-572G, 安装了 Debian 后, 发现只能通过有线网络上网, 无法识别无线网卡, 以下是解决的过程(不局限于此型号 PC): 在命令行键入 lspci , 得 ...
- 来,我们来聊聊怎么学好3dMax三维建模这款软件
效果图公司近年来的发展体现了流行3D技术,而3D技术的应用也越来越广泛,3D为电脑效果图制作的主力.室内效果是设计师进行设计后所达到的效果,除了通常采用的方法外,还应该积极地找寻一种适合的教学方法,培 ...
- nginx禁止特定UA访问
一.UA是什么? User Agent 简称UA,就是用户代理.通常我们用浏览器访问网站,在网站的日志中,我们的浏览器就是一种UA. 二.禁止特定UA访问 最近有个网站(www.C.com)抄袭公司主 ...
- (五)Redux入门
1 Redux概念简述 flux推出的时候有一些缺点.比如store可以存在多个,不是特别好用 于是逐渐进化为了redux. 2 Redux的工作流程 拿借书作举例: action creators是 ...
- (2016北京集训十二)【xsy1542】疯狂求导
题解: 这题看起来很难...但是实际上并没有想象中的那么难 第一眼看上去不会求导公式怎么办?不要紧,题目背景非常良心的给出了题目中的导数计算公式 求完导合并同类项很恶心怎么办?不要紧,样例解释说明了不 ...