Leetcode 1135. 最低成本连通所有城市

devtools/2024/10/24 0:09:50/

1.题目基本信息

1.1.题目描述

想象一下你是个城市基建规划者,地图上有 n 座城市,它们按以 1 到 n 的次序编号。

给你整数 n 和一个数组 conections,其中 connections[i] = [x_i, y_i, cost_i] 表示将城市 x_i 和城市 y_i 连接所要的cost_i(连接是双向的)。

返回连接所有城市的最低成本,每对城市之间至少有一条路径。如果无法连接所有 n 个城市,返回 -1

该 最小成本 应该是所用全部连接成本的总和。

1.2.题目地址

https://leetcode.cn/problems/connecting-cities-with-minimum-cost/description/

2.解题方法

2.1.解题思路

Prim算法求最小生成树

2.2.解题步骤

第一步,构建图的邻接表

第二步,根据Prim算法模板算出最小生成树的节点和最小权值和,判断最小生成树是否存在并返回结果

3.解题代码

Python代码

import heapq
from typing import Dict,List
# ==> Prim算法模板:用于计算无向图的最小生成树及最小权值和
# graph:无向图的邻接表;item项例子:{节点:[[相邻边的权值,相邻边对面的节点],...],...}
# return:minWeightsSum为最小生成树的权值和;treeEdges为一个合法的最小生成树的边的列表(列表项:[节点,对面节点,两点之间的边的权值]);visited:为最小生成树的节点,可以用来判断图中是否存在最小生成树
def primMinSpanningTree(graph:Dict[object,List[List]]):minWeightsSum,treeEdges=0,[]firstNode=list(graph.keys())[0]# 记录已经加入最小生成树的节点visited=set([firstNode])# 选择从firstNode开始,相邻的边加到堆中neighEdgesHeap=[item+[firstNode] for item in graph[firstNode]]heapq.heapify(neighEdgesHeap)while neighEdgesHeap:weight,node,node2=heapq.heappop(neighEdgesHeap) # node2为node的weight权值对应的边的对面的节点if node not in visited:    # 这个地方必须进行判断,否则会造成重复添加已访问节点,造成最小权值和偏大(因为前面遍历的节点可能将未遍历的共同相邻节点重复添加到堆中)minWeightsSum+=weighttreeEdges.append([node,node2,weight])visited.add(node)# 遍历新访问的节点的边,加入堆中for nextWeight,nextNode in graph[node]:if nextNode not in visited:heapq.heappush(neighEdgesHeap,[nextWeight,nextNode,node])return minWeightsSum,treeEdges,visitedclass Solution:def minimumCost(self, n: int, connections: List[List[int]]) -> int:# Prim算法# 第一步,构建图的邻接表graph={i+1:[] for i in range(n)}for connection in connections:graph[connection[0]].append([connection[2],connection[1]])graph[connection[1]].append([connection[2],connection[0]])# print(graph)# 第二步,根据Prim算法模板算出最小生成树的节点和最小权值和,判断最小生成树是否存在并返回结果minWeightsSum,_,nodes=primMinSpanningTree(graph)return minWeightsSum if len(nodes)==n else -1

4.执行结果

在这里插入图片描述


http://www.ppmy.cn/devtools/128300.html

相关文章

|人口分析|007_django基于Python的广东省人口流动数据分析2024_92306i61

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…

生成 Excel 表列名称

Excel 大家都用过,它的列名是用字母编号的,A 表示第一列,B 表示第二列,AA 表示第27列,AB 表示第28列等等。 现给定一个数字,如何得到列名称呢。比如输入28,输出 AB。 一开始以为就是一个简单的…

算法笔记day05

目录 1.最小公倍数 2.最长连续的子序列 3.字母收集 1.最小公倍数 求最小公倍数_牛客题霸_牛客网 算法思路&#xff1a; 这就是一道数学题&#xff0c;a,b的最小公倍数 a * b / 最大公约数。 使用辗转相除法&#xff0c;求a&#xff0c;b的最大公约数。 #include <iostre…

MySQL IN子句:数据顺序与条件顺序不一致情况探究(二)

2. 临时表/派生表的使用 另一个常见的方法是使用一个临时表或派生表&#xff08;也称为子查询&#xff09;来存储IN子句中的 ID&#xff0c;并为这些 ID 添加一个序号&#xff0c;然后在外层查询中根据这个序号进行排序。 使用示例&#xff1a; -- 新建临时表 CTE WITH Rout…

git tag 用法

文章目录 git tag 用法1 概述2 基本用法2.1 创建标签2.1.1 创建轻量级标签2.1.2 创建附注标签 2.2 查看标签2.3 推送标签到远程仓库2.4 删除标签2.5 根据标签拉取代码2.6 注意事项 3 参考资料 git tag 用法 1 概述 git tag 是 Git 版本控制系统中的一个命令&#xff0c;用于为…

学习记录:js算法(七十三):跳跃游戏

文章目录 跳跃游戏思路一&#xff1a;贪心算法思路二&#xff1a;动态规划思路三&#xff1a;递归 记忆化搜索思路四&#xff1a;广度优先搜索 (BFS)思路五&#xff1a;深度优先搜索 (DFS) 跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个 下标 。数…

鹏哥C语言81-82---指针和数组+二级指针+指针数组

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> //--------------------------------------------------------------------------------------------------------5. 指针和数组 数组&#xff1a;一组相同类型元素的集合 指针变量&…

几何算法系列:空间实体体积计算公式推导

1.前言 面积和体积的计算是常见和基础的几何算法话题&#xff0c;面积和体积通常作为面或构件的基本信息参与相关的建模、计算、分析等过程。 有关面积的计算&#xff0c;可以参考博主此前的文章&#xff0c; 一种误差较小的轮廓面积计算算法_轮廓面积计算原理-CSDN博客文章…