UPC6569: Built?(最小生成树)

2024-03-03 04:48
文章标签 最小 生成 built upc6569

本文主要是介绍UPC6569: Built?(最小生成树),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

There are N towns on a plane. The i-th town is located at the coordinates (xi,yi). There may be more than one town at the same coordinates.
You can build a road between two towns at coordinates (a,b) and (c,d) for a cost of min(|a−c|,|b−d|) yen (the currency of Japan). It is not possible to build other types of roads.
Your objective is to build roads so that it will be possible to travel between every pair of towns by traversing roads. At least how much money is necessary to achieve this?

Constraints
2≤N≤105
0≤xi,yi≤109
All input values are integers.

 

输入

Input is given from Standard Input in the following format:

N
x1 y1
x2 y2
:
xN yN

 

输出

Print the minimum necessary amount of money in order to build roads so that it will be possible to travel between every pair of towns by traversing roads.

 

样例输入

3
1 5
3 9
7 8

 

样例输出

3

 

提示

Build a road between Towns 1 and 2, and another between Towns 2 and 3. The total cost is 2+1=3 yen.

 

题意:给n个点,可以在任意两点之间修建道路,花费为min(|x1-x2|,|y1-y2|),问最少花费多少可以连通任意两点。

很容易可以看出这是一个最小生成树的问题,难点在于建图,

建图的话先对x排序相邻两点建条边,在对y排序相邻两点在建一条边,然后直接用最小生成树的算法就可以了。

 

#include<bits/stdc++.h> 
using namespace std;
const int L = 500005;
struct point{int xx, yy, ww;
}poi[100005];
struct node{int s, y, w;}edge[L];
int Fa[L], n, m;
void init(){for(int i = 0; i <= n; i++){Fa[i] = i;}
}
int Find(int x)//查询属于哪个集合
{if(Fa[x] == x) return x;else return Fa[x] = Find(Fa[x]);
}
void unite(int x,int y)//合并x,y两个元素
{x = Find(x);y = Find(y);if(x != y)Fa[y] = x;
}
bool same(int x, int y)//【判断是否属于同个集合
{return Find(x) == Find(y);
}
bool cmp(node a, node b)
{return a.w < b.w;
}
bool cmp1(point x, point y){return x.xx < y.xx;
}
bool cmp2(point x, point y){return x.yy < y.yy;
}int main()
{scanf("%d", &n);for(int i = 0; i < n; i++){scanf("%d%d", &poi[i].xx, &poi[i].yy);poi[i].ww = i;}m = 0;sort(poi, poi + n, cmp1);for(int i = 0; i < n; i++){if(i + 1 < n){edge[m].s = poi[i].ww;edge[m].y = poi[i + 1].ww;edge[m].w = fabs(poi[i].xx - poi[i + 1].xx);m++;}if(i - 1 >= 0){edge[m].s = poi[i].ww;edge[m].y = poi[i - 1].ww;edge[m].w = fabs(poi[i].xx - poi[i - 1].xx);m++;}}sort(poi, poi + n, cmp2);for(int i = 0; i < n; i++){if(i + 1 < n){edge[m].s = poi[i].ww;edge[m].y = poi[i + 1].ww;edge[m].w = fabs(poi[i].yy - poi[i + 1].yy);m++;}if(i - 1 >= 0){edge[m].s = poi[i].ww;edge[m].y = poi[i - 1].ww;edge[m].w = fabs(poi[i].yy - poi[i - 1].yy);m++;}}init();sort(edge, edge + m, cmp);int sum = 0, cnt = 0;for(int i = 0; i < m; i++){if(cnt == n - 1)break;if(!same(edge[i].s, edge[i].y)){unite(edge[i].s, edge[i].y);sum += edge[i].w;cnt++;}}printf("%d\n", sum);return 0;
}

 

这篇关于UPC6569: Built?(最小生成树)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/768498

相关文章

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

C/C++随机数生成的五种方法

《C/C++随机数生成的五种方法》C++作为一种古老的编程语言,其随机数生成的方法已经经历了多次的变革,早期的C++版本使用的是rand()函数和RAND_MAX常量,这种方法虽然简单,但并不总是提供... 目录C/C++ 随机数生成方法1. 使用 rand() 和 srand()2. 使用 <random

Flask 验证码自动生成的实现示例

《Flask验证码自动生成的实现示例》本文主要介绍了Flask验证码自动生成的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 目录生成图片以及结果处理验证码蓝图html页面展示想必验证码大家都有所了解,但是可以自己定义图片验证码

Python如何在Word中生成多种不同类型的图表

《Python如何在Word中生成多种不同类型的图表》Word文档中插入图表不仅能直观呈现数据,还能提升文档的可读性和专业性,本文将介绍如何使用Python在Word文档中创建和自定义各种图表,需要的... 目录在Word中创建柱形图在Word中创建条形图在Word中创建折线图在Word中创建饼图在Word

nginx生成自签名SSL证书配置HTTPS的实现

《nginx生成自签名SSL证书配置HTTPS的实现》本文主要介绍在Nginx中生成自签名SSL证书并配置HTTPS,包括安装Nginx、创建证书、配置证书以及测试访问,具有一定的参考价值,感兴趣的可... 目录一、安装nginx二、创建证书三、配置证书并验证四、测试一、安装nginxnginx必须有"-

Java实战之利用POI生成Excel图表

《Java实战之利用POI生成Excel图表》ApachePOI是Java生态中处理Office文档的核心工具,这篇文章主要为大家详细介绍了如何在Excel中创建折线图,柱状图,饼图等常见图表,需要的... 目录一、环境配置与依赖管理二、数据源准备与工作表构建三、图表生成核心步骤1. 折线图(Line Ch