这道题真的是令人窒息,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. (转载)7个去伪存真的JavaScript面试题

    7个去伪存真的JavaScript面试题 上周,我发表了<C#程序员的7个面试问题>.这次我要说的是如何淘汰那些滥竽充数的JavaScript程序员. 作者:小峰来源:码农网|2015-0 ...

  2. 安装Windows服务方法

    用sc create 服务名 binPath="路径",不要用老方法InstallUtil会出现一堆的错误

  3. Mysql表引擎的切换

    转换MYSQL表的引擎 1.方法一:Alter table 将1个表的引擎修改为另一个引擎最简单的方法是使用Alter table语句. 下面的语句将myTable的引擎修改为InnoDB mysql ...

  4. QT笔记 -- (5) 实现QWidget的paintEvent函数,在widget上画背景图形

    如图,想在界面上画个弧线和直线,于是继承QWidget得到类MainContainer,并实现了paintEvent函数.然后用类MainContainer定义centralWidget. MainC ...

  5. Dapper Dapper-Extensions

    之前公司在开发项目的时候有用到过Dapper 仓储 以及IOC Castel .最近新项目上想使用上这些技术,决定新学习一下. 看了很多资料,发现几个比较容易菜鸟的我理解的,整理下来,找时间好好整理一 ...

  6. jQuery基本操作以及与js的一些比较

    jQuery和js主要区别在DOM操作 用jQuery必须先引进jQuery.js文件 js和jQuery写在哪: 1.标签里面 常用就是方法调用 2.写在script标签里面 3.js文件 dom操 ...

  7. 虚拟集群LVS及DR模式搭建笔记

    LVS(虚拟集群Linux Virtual Server) LVS-NAT:地址转换,数据包来回都要经过NAT转换,所以Director Server(即LVS服务器)将成为系统瓶颈.使用NAT模式将 ...

  8. 最强最全干货分享:Android开发书籍、教程、工具等

    最全干货分享,本文收集整理了Android开发所需的书籍.教程.工具.资讯和周刊各种资源,它们能让你在Android开发之旅的各个阶段都受益. 入门<Learning Android(中文版)& ...

  9. UILite-MFC/WTL/DirectUI界面库

    之前写了UILite库介绍: http://blog.csdn.net/zhangzq86/article/details/9093945 如今UILite库能够使用git訪问了: https://g ...

  10. Android中设置半个屏幕大小且居中的button布局 (layout_weight属性)

            先看例如以下布局 :