算法案例精讲:连接所有点的最小费用

我们先来看题目描述:

给你一个 points 数组,表示 2D 平面上的一些点,其中 pointsi = xi, yi 。 连接点 xi, yi 和点 xj, yj 的费用为它们之间的 曼哈顿距离 :|xi - xj| + |yi - yj| ,其中 |val| 表示 val 的绝对值。 请你返回将所有点连接的最小总费用。只有任意两点之间 有且仅有 一条简单路径时,才认为所有点都已连接。

示例 1:

复制代码
输入:points = [[0,0],[2,2],[3,10],[5,2],[7,0]] 
输出:20 
解释: 

我们可以按照上图所示连接所有点得到最小总费用,总费用为 20 。

注意到任意两个点之间只有唯一一条路径互相到达。

示例 2:

复制代码
输入:points = [[3,12],[-2,5],[-4,1]] 
输出:18

示例 3:

复制代码
输入:points = [[0,0],[1,1],[1,0],[-1,1]] 
输出:4

示例 4:

复制代码
输入:points = [[-1000000,-1000000],[1000000,1000000]] 
输出:4000000

示例 5:

复制代码
输入:points = [[0,0]] 
输出:0

题解: Kruskal 算法需要用到 Union-Find 并查集算法,因为生成的树不能包含环,而并查集可以用来判环。 对于添加的某条边,如果该边的两个节点本来就在同一连通分量里,那么添加这条边会产生环;

反之,如果该边的两个节点不在同一连通分量里,则添加这条边不会产生环。 为了得到的这棵生成树是权重和最小的,用到了贪心思路: 将所有边按照权重从小到大排序,从权重最小的边开始遍历,如果这条边和 mst 中的其它边不会形成环,则这条边是最小生成树的一部分,将它加入 mst 集合;否则,这条边不是最小生成树的一部分,不要把它加入 mst 集合。

相关推荐
迈巴赫车主1 小时前
蓝桥杯21241灯塔java
java·开发语言·数据结构·算法·职场和发展·蓝桥杯·动态规划
wabs6661 小时前
关于贪心算法【968.监控二叉树】的想法
算法·贪心算法
め.2 小时前
GJK+EPA算法
算法
木井巳2 小时前
【DFS解决floodfill算法】岛屿数量
java·算法·leetcode·深度优先
好评笔记2 小时前
深度学习面试八股——循环神经网络RNN
人工智能·rnn·深度学习·神经网络·算法·机器学习·aigc
凯瑟琳.奥古斯特2 小时前
力扣1003题C++解法详解
开发语言·c++·算法·leetcode·职场和发展
计算机安禾2 小时前
【算法分析与设计】第48篇:流算法与数据概要技术
java·服务器·网络·数据库·算法
hunterkkk(c++)2 小时前
SPFA最短路径算法(c++)
java·c++·算法
weixin_446260852 小时前
HANDOFF:基于蒸馏互补教师的人形机器人任务空间整体控制
人工智能·算法·机器人