题解 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 ...
随机推荐
- 51nod 1272 最大距离 O(nlog(n)) , 快排 , 最大连续子串
题目: 解法:排序,把值小的和索引小的放在前面,记录一下之前索引最小的就可以了. 没什么可以讲的,上代码吧: #include <bits\stdc++.h> using namespac ...
- XManager远程Linux 安装Oracle 图形化界面xstart解决方法
一.安装Oracle_11g_R21.安装所必要的软件包:(CentOS)参见官方文档-rw-r--r--. 1 oracle oinstall 1358454646 Feb 5 22:57 p10 ...
- ZBrush软件特性之Material
在ZBrush中,任何物体表面的外观都是多种因素的综合结果,例如基础颜色.纹理图像投落到表面上的照明效果和材质属性.材质可以改变照明在表面上的反应,以便模型表现出光泽.凹凸.反射.金属性或透明效果.Z ...
- CDR X6低价还能持续多久?官方回应18年元旦过后要涨价
目前,CDR X6特价活动,从双十二的到18年的元旦,火热程度一直屡刷新高,究其原因,其实不是大家不需要,只是这个平面设计软件价格实在太高(CDR X8/8200:CDR 2017/9500一套),尤 ...
- map循环遍历
data.map(function(item){ item.show = false; //将拿到的data循环给每一项添加show属性 });
- [六省联考2017]分手是祝愿(期望+DP)
题解 很容易想出来最优策略是什么. 就是从n到1看到开着的灯就把它关了 我们预处理出当前状态把灯全部关闭后的最少步数cnt 然后我们的主人公就要瞎按... 设dp[i]代表当前状态最优解为i步时走到d ...
- C语言数组和指针是不同的
有一个这样的错误: 在一个文件中定义:int mango[100]; 在另一个文件中声明:extern int *mango; 将会产生错误 定义和声明的区别: 在C中,任何对象都有且只有一个定义 ...
- nginx开启gzip压缩后导致apk包下载不能正常安装
最后更新时间:2019/4/27 nginx一般都会开启gzip压缩,以提升传输性能. 配置如下: gzip on; gzip_comp_level 2; gzip_min_length 1k; gz ...
- 紫书 习题 11-1 UVa 821 (Floyd)
水题, Floyd一遍就完了. #include<cstdio> #include<algorithm> #define REP(i, a, b) for(int i = (a ...
- 中国象棋程序的设计与实现(六)--N皇后问题的算法设计与实现(源码+注释+截图)
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题. 该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列 ...