求最小生成树(Kruskal算法和Prim算法)

news2024/11/26 4:49:38

目录

一、前言

二、相关概念

1、最小生成树

2、Prim算法(对结点进行操作)

3、kruskal 算法(对边进行操作)

三、例题

1、修建公路(lanqiaoOJ题号1124)

1、Prim算法题解

2、Kruskal算法


一、前言

很久没更新了蓝桥杯算法栏目了,明天国赛了,浅更新一下,求最小生成树,相信大家都会,本文带大家来回顾一下这两个非常简单好用的算法。(贵在理解算法逻辑,代码什么的都是次要)

二、相关概念

1、最小生成树

  • 在无向图中,连通而且不含有圈(环路)的图,称为树。
  • 最小生成树MST:一个有n个结点的连通图的生成树是原图的极小连通子图,包含原图中的所有n个结点,并旦边的权值之和最小。
  • 两种算法:prim、kruskal

2、Prim算法(对结点进行操作)

  • 对点进行贪心操作:“最近的邻居一定在 MST 上”。
  • 从任意一个点 u 开始,把距离它最近的点 v 加入到 MST 中;下一步,把距离 {u, v} 最近的点 w 加入到 MST 中;继续这个过程,直到所有点都在 MST 中。

补充:1956年,Dijkstra在一篇论文中同时提出了这两个算法,两个算法的思想基本一样,都是基于贪心法来扩展结点,执行步骤十分相似,代码只有微小差别。

3、kruskal 算法(对边进行操作)

  • 对边进行贪心操作:“最短的边一定在 MST 上”。
  • 从最短的边开始,把它加入到 MST 中;在剩下的边中找最短的边,加入到 MST 中;继续这个过程,直到所有点都在 MST 中。

补充:

kruskal 算法的 2 个关键技术:

1)对边进行排序。

2)判断圈,即处理连通性问题。这个问题用并查集简单而高效,并查集是 kruskal 算法的实现基础。

三、例题

1、修建公路(lanqiaoOJ题号1124)

链接:用户登录

可能部分同学没办法进入到链接刷这道题,我把题目放上来。

题目描述

L 城一共有 N 个小区。

小明是城市建设的规划者,他计划在城市修 M 条路,每修建一条路都要支付工人们相应的工钱(需要支付的工钱 == 路的长度)。

然而小明所拿到的经费并不够支付修建 M 条路的工钱,于是迫于无奈,他只能将计划改变为修建若干条路,使得 N 个小区之间两两联通。

小明希望尽量剩下更多的经费投入到别的项目中,因此请你通过程序帮他计算出完成计划所需的最低开销。

输入描述

输入第一行包含三个正整数 N,M。

第 2 到 M+1 行每行包含三个正整数 u, v, w,表示 u↔v 之间存在一条距离为 w 的路。

1≤N≤10^5,0≤m≤3×10^5,1≤ui​,vi​≤N,0≤wi​≤10^9。

输出描述

输出占一行,包含一个整数,表示完成计划所需的最低开销。

若无法完成计划,则输出 −1。

输入输出样例

输入:

5 6
1 2 2
1 3 7
1 4 6
2 3 1
3 4 3
3 5 2

输出:

8

运行限制

  • 最大运行时间:3s
  • 最大运行内存:256M

1、Prim算法题解

python代码(AC):

import sys
from heapq import *
input=sys.stdin.readline

def prim():
    ans,cnt=0,0
    q=[]
    vis=[False for _ in range(n+1)]
    heappush(q,(0,1))
    while q and cnt<n:
        w,u=heappop(q)      #pop出距离集合最近的点u
        if not vis[u]:
            vis[u]=True
            ans+=w
            cnt+=1
            for v,w in e[u]:
                heappush(q,(w,v))
    if cnt!=n:
        print(-1)
    else:
        print(ans)
        
n,m=map(int,input().split())
e=[[] for _ in range(n+1)]
for i in range(m):
    u,v,w=map(int,input().split())
    e[u].append((v,w))
    e[v].append((u,w))
prim()

2、Kruskal算法

python代码(AC):

import sys
input=sys.stdin.readline

def init():
    for i in range(n+1):
        s.append(i)

def find(x):
    if s[x]==x:
        return x
    s[x]=find(s[x])
    return s[x]

def kruskal():
    cnt=0
    ans=0
    e.sort(key=lambda tup:tup[2])
    init()
    for i in range(m):
        x,y=e[i][0],e[i][1]
        e1,e2=find(x),find(y)
        if e1==e2:
            continue
        ans+=e[i][2]
        s[find(y)]=find(x)
        cnt+=1
        if cnt==n-1:
            break
    if cnt!=n-1:
        print(-1)
    else:
        print(ans)

e=[]
s=[]
n,m=map(int,input().split())       #顶点数,边数
for i in range(m):
    u,v,w=map(int,input().split())
    e.append((u,v,w))
kruskal()

根据这一题相信大家都能很好的理解Prim和Kruskal算法。

以上,求最小生成树(Kruskal算法和Prim算法)

煮好!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/627578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyToch 深度学习 || 卷积神经网络分类

卷积神经网络分类 import torch import torch.nn as nn import torchvision import numpy as np from torch.autograd import Variable import matplotlib.pyplot as plt import torch.nn.functional as F import torch.utils.data as Data from torchvision import datasets,…

【业务功能篇20】Springboot java逻辑实现动态行转列需求

在此前&#xff0c;我也写过一个行转列的文章&#xff0c;是用存储过程sql处理的一个动态的逻辑 Mysql 存储过程\Mybatis框架call调用 实现动态行转列 那么后面我们同样又接收了业务的一个新需求&#xff0c;针对的是不同的业务数据&#xff0c;做的同样的一个展示数据报表&…

【C++11】 initializer_list | 右值引用 | 移动构造 | 完美转发

文章目录 1. 统一的列表初始化{ } 初始化initializer_list 2. 引用左值引用右值引用左值引用与右值引用的相互转换右值引用的真正使用场景移动构造 C98与C11传值返回问题注意事项总结 3. 完美转发 1. 统一的列表初始化 { } 初始化 C11 扩大了括号括起的列表(初始化列表)的使用…

使用PHP导出Excel时处理复杂表头的万能方法

使用PHP导出Excel时&#xff0c;如果是一级表头处理起来很简单&#xff0c;但如果碰到复杂一点的表头&#xff0c;比如二级、三级&#xff0c;甚至更多级别的表头要怎么办呢&#xff1f; 就像下面这个表头&#xff0c;有三层&#xff0c;并且每层都不太规则—— 难道我们每次处…

动态绑定v-model,并解决输入框无法输入和无法双向绑定问题

问题&#xff1a;在界面中想要动态获取数据库中返回的数据&#xff0c;作为下拉的值&#xff0c;每个下拉值中又包含不同的属性信息&#xff0c;给输入框动态绑定v-model&#xff0c;但是绑定成功后输入框内无法输入内容&#xff0c;且没有双向绑定 解决思路&#xff1a;1.双向…

SIM:基于搜索的用户终身行为序列建模

SIM&#xff1a;基于搜索的用户终身行为序列建模 论文&#xff1a;《Search-based User Interest Modeling with Lifelong Sequential Behavior Data for Click-Through Rate Prediction》 下载地址&#xff1a;https://arxiv.org/abs/2006.05639 1、用户行为序列建模回顾 1…

在 AWS 上使用 OpenText 实现业务关键型应用程序的现代化

通过在云中进行信息管理建立持久的竞争优势 创新在云中发生的速度比以往任何时候都快。 企业面临着数字经济快速转型的挑战&#xff0c;充分释放业务信息的能力对于建立持久的竞争优势至关重要。为分散的员工扩大安全可靠的协作范围将是生产力和创新的关键驱动力。 如今大多…

Web UI自动化测试之元素定位

目前&#xff0c;在自动化测试的实际应用中&#xff0c;接口自动化测试被广泛使用&#xff0c;但UI自动化测试也并不会被替代。让我们看看二者的对比&#xff1a; 接口自动化测试是跳过前端界面直接对服务端的测试&#xff0c;执行效率和覆盖率更高&#xff0c;维护成本更低&am…

【EtherCAT】一、入门基础

什么是EtherCAT&#xff1f; 介绍简介特点和优势EtherCAT系统组成主站从站 硬件EtherCAT主站芯片EtherCAT从站芯片 EtherCAT应用层协议 工具软件 介绍 简介 EtherCAT&#xff08;Ethernet Control Automation Technology&#xff09;是一种高性能实时以太网通信协议&#xff…

Ubuntu20.04设置开机自启动脚本

1.建立开机启动服务 sudo vim /lib/systemd/system/rc-local.service 在末尾添加 [Install] WantedBymulti-user.target Aliasrc-local.service2.创建 /etc/rc.local sudo touch /etc/rc.local && sudo chmod 755 /etc/rc.local #!/bin/bash cd /home/docker-data/ss…

前端框架笔记

Vue.js的安装 安装Vue.js有两种方法&#xff1a; &#xff08;1&#xff09;类似于Bootstrap或jQuery&#xff0c;直接通过HTML文件中的标签引用。为了方便开发者使用&#xff0c;Vue.js提供了相关的CDN&#xff0c;通过如下代码可以引用最新版本的Vue.js&#xff1a; <sc…

小黑回到学校,跟小老黑中老黑阿黄一起度过最后在学校的日子的leetcode之旅:3. 无重复字符的最长子串

双指针动态滑动窗口 class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# 字符串长度n len(s)# 双指针left 0right 0# 存储集合set_ set()# 当前子串长度cur_len 0# 结果result 0# 分别遍历每一个右指针while right < n:# 该字符是重复的&#x…

向量相似搜索绕不开的局部敏感哈希

在搜索推荐中&#xff0c;通常使用相似Embedding进行推荐&#xff0c;此时就会有一个问题&#xff1a;如何快速找到与一个Embedding相近的其他Embedding。 如果两个Embedding在同一个向量空间中&#xff0c;我们就可以通过很多种方式&#xff08;内积、余弦、欧氏距离等&#…

python3 爬虫相关学习8:python 的常见报错内容 汇总收集

目录 1 拼写错误 AttributeError: NameError: 等等 2 类型错误 TypeError: 如字符串连接错误 TypeError: can only concatenate str (not “int“) to str 3 意外缩进 IndentationError: unexpected indent 4 找不到对应模块 ModuleNotFoundError: 5 语法错误 Syntax…

【Docker】deepin/centos安装docker

deepin虚拟机和centos服务器安装docker 1.更新软件包 # deepin sudo apt-get update && sudo apt-get upgrade # centos sudo yum update && yum upgrade安装docker之前&#xff0c;先更新一下软件包 mothramothra-PC:~$ sudo apt-get update && sud…

《Lua程序设计》--学习6

日期和时间 第1种表示方式是一个数字&#xff0c;这个数字通常是一个整型数。尽管并非是ISO C所必需的&#xff0c;但在大多数系统中这个数字是自一个被称为纪元&#xff08;epoch&#xff09;的固定日期后至今的秒数。 Lua语言针对日期和时间提供的第2种表示方式是一个表。日…

苹果新专利曝光,用户可通过Apple Watch及MR头显摄像头设置3D虚拟化身

美国专利商标局公布了苹果公司的一项专利申请&#xff0c;涉及提供计算机生成体验的计算机系统&#xff0c;包括但不限于通过显示器提供 VR 和 MR 体验的电子设备。 在一个例子中&#xff0c;苹果展示了 Apple Watch 的未来版本&#xff0c;该版本将允许用户使用 Apple Watch…

ceph安装搭建总结

ceph安装搭建总结 大纲 版本选择集群架构免密登录安装ceph-deploy部署ceph集群安装mgr安装ceph-dashboard 版本选择 ceph 版本信息如下 本次测试使用版本为Octopus 主版本号为15&#xff0c; 并且使用ceph-deploy 2.0.1安装ceph集群 Ceph Octopus 官方文档 相关环境与软件…

找不到msvcp140.dll无法继续执行代码,解决方法

msvcp140.dll电脑文件中的dll文件&#xff0c;即动态链接库文件&#xff0c;若计算机中丢失了某个dll文件&#xff0c;就会导致某些软件和游戏等程序无法正常启动运行&#xff0c;并且导致电脑系统弹窗报错&#xff0c;其安装方法&#xff1a;1、打开浏览器输入“【dll修复程序…

迅为iTOP-RK3588开发板Android12源码定制开发kernel开发

内核版本是 5.10.66 版本&#xff0c;内核默认的配置文件是 3588-android12/kernel-5.10/arch/arm64/configs/rockchip_defconfig 如果我们要使用图形化界面配置内核&#xff0c;操作方法如下所示&#xff1a; 方法一&#xff1a; 1 首先将默认的配置文件 rockchip_defconf…