这道题真的是令人窒息,Kruskal调了贼久一直RE,最后发现数组大小稍微少了那么一点点。(也就10倍吧。。)

言归正传,根据本人的分析(以及算法标签的提示),这是一道求最小生成树的题目,当然要注意已经有一些路被建成了,因此他们直接标0即可

下面是这道题用到了的所有(全局)变量。

maxn, n, m就不解释了。

x[]和y[]是用来储存农场的坐标的,当然也可以用二维数组写,只是我懒得敲那么多字(说起来差别也不大)。

f是并查集中储存祖先的数组。

如果有不了解的并查集的可以参考这一片讲解,个人认为十分通俗易懂。 传送门

f1和f2是后面暂时储存有道路连接的农场的变量。

top是Kruskal主体中记录最顶层的。

cnt是记录长度的。

ans我觉得也是废话(耶,皮这一下我很开心)。

  1. const int maxn = ;
  2.  
  3. int n, m;
  4. int x[maxn], y[maxn], f[maxn], f1, f2;
  5. int top = , cnt = ;
  6. double ans = ;

接下来是储存两点距离的结构体,以及结构体排序。

  1. struct node {
  2. int x, y;
  3. double val;
  4. }dis[maxn];
  5.  
  6. bool cmp(node a, node b) {
  7. if(a.val == b.val)
  8. return a.x < b.x;
  9. return a.val < b.val;
  10. }

以及并查集模板(其中find函数使用了路径压缩)

  1. int find(int x) {
  2. int r = x;
  3. while(r != f[r]) r = f[r];
  4. int i = x, j;
  5. while(f[i] != r) {
  6. j = f[i];
  7. f[i] = r;
  8. i = j;
  9. }
  10. return r;
  11. }
  12.  
  13. void merge(int x, int y) {
  14. x = find(x);
  15. y = find(y);
  16. if(x != y) f[y] = x;
  17. }

 

偶对了还有最没用的函数dt,用于求两点距离。

  1. double dt(int x1,int x2,int y1,int y2) {
  2. return sqrt(pow(double(x1 - x2), ) + pow(double(y1 - y2), ));
  3. }

接下来果断开始主函数part。

读入数据,别忘了初始化并查集。

  1. cin >> n >> m;
  2. for(int i = ; i <= n; i++) cin >> x[i] >> y[i];
  3. for(int i = ; i <= n; i++) f[i] = i;
  4. for(int i = ; i <= n; i++)
  5. for(int j = i + ; j <= n; j++) {
  6. dis[++cnt].x = i;
  7. dis[cnt].y = j;
  8. dis[cnt].val = dt(x[i], x[j], y[i], y[j]);
  9. }
  10. for(int i = ; i <= m; i++) {
  11. cin >> f1 >> f2;
  12. dis[++cnt].x = f1;
  13. dis[cnt].y = f2;
  14. dis[cnt].val = ;
  15. }

然后给dis排个序。

sort(dis + , dis + cnt + , cmp);

最重要的部分:Kruskal模板

Kruskal算法将图中的每一个顶点视为一个独立的集合,首先将图中所有的边按权值大小从小到大排列,接着按顺序选择每一条边,如果这条边的两个端点不属于同一个集合,那么将它们所在的集合合并,同时将这条边加入E’。直到所有的顶点都属于同一个集合时,E’就是一颗最小生成树。

--摘抄自《ACM国际大学生程序设计竞赛 知识与入门》

  1. for(int i = ; i <= cnt; i++) {
  2. if(find(dis[++top].x) != find(dis[top].y)) {
  3. ans += dis[top].val;
  4. merge(dis[top].x, dis[top].y);
  5. }
  6. }

最后,愉快的输出结果就好了,别忘了要保留两位小数。

题解 P2872 【[USACO07DEC]道路建设Building Roads】的更多相关文章

  1. 洛谷 P2872 [USACO07DEC]道路建设Building Roads 题解

    P2872 [USACO07DEC]道路建设Building Roads 题目描述 Farmer John had just acquired several new farms! He wants ...

  2. bzoj1626 / P2872 [USACO07DEC]道路建设Building Roads

    P2872 [USACO07DEC]道路建设Building Roads kruskal求最小生成树. #include<iostream> #include<cstdio> ...

  3. 洛谷——P2872 [USACO07DEC]道路建设Building Roads

    P2872 [USACO07DEC]道路建设Building Roads 题目描述 Farmer John had just acquired several new farms! He wants ...

  4. 洛谷 P2872 [USACO07DEC]道路建设Building Roads

    题目描述 Farmer John had just acquired several new farms! He wants to connect the farms with roads so th ...

  5. $P2872\ [USACO07DEC]道路建设Building\ Roads$

    \(problem\) 错的原因是\(RE\)(大雾 , 时刻谨记 \(N\) 个地方的话 保守开 \(\frac{N^2}{2}\) 大小. 因为是边. 边最多的情况即完全图 : $1+2+3+4. ...

  6. 洛谷 P2872 【[USACO07DEC]道路建设Building Roads】

    P2872 传送门 首先 题目概括:题目让着求使所有牧场都联通.需要修建多长的路. 显然这是一道最小生成树板子题(推荐初学者做). 那我就说一下kruskal吧. Kruskal算法是一种用来查找最小 ...

  7. [USACO07DEC]道路建设Building Roads

    题目:洛谷P2872.POJ3625. 题目大意:给你n个点的坐标,有些点已经有边连通,现在要你连上剩下的所有点,求这些边的最小长度是多少(不包括原来的边). 解题思路:最小生成树,把所有边处理出来, ...

  8. USACO 07DEC 道路建设(Building Roads)

    Farmer John had just acquired several new farms! He wants to connect the farms with roads so that he ...

  9. USACO Building Roads

    洛谷 P2872 [USACO07DEC]道路建设Building Roads 洛谷传送门 JDOJ 2546: USACO 2007 Dec Silver 2.Building Roads JDOJ ...

随机推荐

  1. 51nod 1272 最大距离 O(nlog(n)) , 快排 , 最大连续子串

    题目: 解法:排序,把值小的和索引小的放在前面,记录一下之前索引最小的就可以了. 没什么可以讲的,上代码吧: #include <bits\stdc++.h> using namespac ...

  2. XManager远程Linux 安装Oracle 图形化界面xstart解决方法

    一.安装Oracle_11g_R21.安装所必要的软件包:(CentOS)参见官方文档-rw-r--r--. 1 oracle oinstall 1358454646 Feb  5 22:57 p10 ...

  3. ZBrush软件特性之Material

    在ZBrush中,任何物体表面的外观都是多种因素的综合结果,例如基础颜色.纹理图像投落到表面上的照明效果和材质属性.材质可以改变照明在表面上的反应,以便模型表现出光泽.凹凸.反射.金属性或透明效果.Z ...

  4. CDR X6低价还能持续多久?官方回应18年元旦过后要涨价

    目前,CDR X6特价活动,从双十二的到18年的元旦,火热程度一直屡刷新高,究其原因,其实不是大家不需要,只是这个平面设计软件价格实在太高(CDR X8/8200:CDR 2017/9500一套),尤 ...

  5. map循环遍历

    data.map(function(item){ item.show = false; //将拿到的data循环给每一项添加show属性 });

  6. [六省联考2017]分手是祝愿(期望+DP)

    题解 很容易想出来最优策略是什么. 就是从n到1看到开着的灯就把它关了 我们预处理出当前状态把灯全部关闭后的最少步数cnt 然后我们的主人公就要瞎按... 设dp[i]代表当前状态最优解为i步时走到d ...

  7. C语言数组和指针是不同的

    有一个这样的错误: 在一个文件中定义:int mango[100];  在另一个文件中声明:extern int *mango;  将会产生错误 定义和声明的区别: 在C中,任何对象都有且只有一个定义 ...

  8. nginx开启gzip压缩后导致apk包下载不能正常安装

    最后更新时间:2019/4/27 nginx一般都会开启gzip压缩,以提升传输性能. 配置如下: gzip on; gzip_comp_level 2; gzip_min_length 1k; gz ...

  9. 紫书 习题 11-1 UVa 821 (Floyd)

    水题, Floyd一遍就完了. #include<cstdio> #include<algorithm> #define REP(i, a, b) for(int i = (a ...

  10. 中国象棋程序的设计与实现(六)--N皇后问题的算法设计与实现(源码+注释+截图)

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题. 该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列 ...