这道题真的是令人窒息,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】的更多相关文章

  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. Andoid CustomCircleProgress 半圆

    package com.play.playgame.view; import android.content.Context; import android.graphics.Canvas; impo ...

  2. 如何在Windows下安装Linux子系统(Ubuntu,openSUSU,SUSU Linux Server)

    注意:只有win10才能安装,安装的linux没有图形界面. 1.首先在win10设置 --> 更新与安装 --> 针对开发人员 ,选择开发人员模式. 2.win10 Cortana -- ...

  3. [arc067f]yakiniku restaurants

    题意: n家饭店,m张餐票,第i家和第i+1家饭店之间的距离是$A_i$,在第i家饭店用掉第j张餐票会获得$B_{i,j}$的好感度,但是从饭店i走到饭店j会有$dis_{i,j}$的代价,可以从任意 ...

  4. hadoop-11-ambari-server安装

    hadoop-11-ambari-server安装 #ambari 安装yum install ambari-servercd mysql-5.7.18/cp mysql-connector-java ...

  5. Android使用ShowcaseView加入半透明操作提示图片的方法

    http://beeder.me/2014/11/11/how-to-add-a-semi-transparent-demo-screen-using-showcaseview/ 这篇文章具体介绍了如 ...

  6. [MST] Remove Model Instances from the Tree

    In this lesson we will dive a bit more into the tree semantics of MST. In this lesson you will learn ...

  7. Implement Stack using Queues 用队列实现栈

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...

  8. hdu3468 Treasure Hunting 二分匹配

    //给一个n*m的图 //.表示空白地 //*表示有黄金 //#表示墙 //一个人须要依照A...Z..a..z的顺序以最短路径走到下一个 //每次仅仅能在他的路线上经过的地方取一块黄金 //问最多能 ...

  9. 《从零開始学Swift》学习笔记(Day 51)——扩展构造函数

    创文章.欢迎转载.转载请注明:关东升的博客 扩展类型的时候,也能够加入新的构造函数.值类型与引用类型扩展有所差别.值类型包含了除类以外的其它类型.主要是枚举类型和结构体类型. 值类型扩展构造函数 扩展 ...

  10. mac鼠标滚动方向自然问题

    mac使用鼠标的时候滚轮方向和Windows是相反的.假设不勾选滚动方向自然,那么触摸板使用不爽. 解决的方法: 1.打开http://pilotmoon.com/scrollreverser/,下载 ...