每周一算法:Prim算法求最小生成树

题目链接

[最短网络]

题目描述

Farmer John 被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。

FJ 已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了用最小的消费,他想铺设最短的光纤去连接所有的农场。

你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。每两个农场间的距离不会超过 1 0 5 10^5 105

输入格式

第一行农场的个数 N N N 3 ≤ N ≤ 100 3≤N≤100 3N100)。

接下来是一个 N × N N×N N×N的矩阵,表示每个农场之间的距离。它们是 N N N行,每行由 N N N个用空格分隔的数组成;当然,对角线将会是 0 0 0,因为不会有线路从第 i i i个农场到它本身。

输出格式

只有一个输出,其中包含连接到每个农场的光纤的最小长度。

样例 #1

样例输入 #1

4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0

样例输出 #1

28

提示

【数据范围】

3 ≤ N ≤ 100 3≤N≤100 3N100
每两个农场间的距离不会超过 1 0 5 10^5 105

算法思想

根据题目描述,从一份各农场之间连接费用的列表中,找出能连接所有农场所用光纤最短的方案。即在一个无向图求边权和最小的生成树,即无向连通图的最小生成树(Minimum Spanning Tree,MST)。

注意:只有连通图才有生成树,而对于非连通图,只存在生成森林。

最小生成树的算法很多,常用的有两种「Prim」算法和「Kruskal」算法。

Prim算法的基本思想是从一个节点开始,不断加点。具体来说,每次要选择距离连通块最小的一个节点,用新的边更新其他节点到连通块的距离。

跟 Dijkstra 算法类似,每次找到距离最小的一个点,可以暴力找也可以用堆维护。一般在稠密图尤其是完全图上,使用 Prim 算法;而稀疏图常用Kruskal算法。

时间复杂度

暴力: O ( n 2 + m ) O(n^2+m) O(n2+m)

二叉堆: O ( ( n + m ) log ⁡ n ) O((n+m) \log n) O((n+m)logn)

代码实现

#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int n;
int w[N][N];
//dist[i]表示点i到连通块的最短距离
//st[i]表示i是否在连通块中
int dist[N], st[N];int prim()
{memset(dist, 0x3f, sizeof dist);dist[1] = 0; //选择1号点作为生成树的第1个点int res = 0;for(int i = 1; i <= n; i++){int t = -1; //暴力求不在连通块中且距离连通块最近的点tfor(int j = 1; j <= n; j++){if(!st[j] && (t == -1 || dist[j] < dist[t])) t = j;}st[t] = 1; //将t点加入连通块res += dist[t]; //累加边权和//用t缩短其它节点到连通块的距离for(int j = 1; j <= n; j++) dist[j] = min(dist[j], w[t][j]);}return res;
}int main()
{cin >> n;for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)cin >> w[i][j];cout << prim() << endl;return 0;
}

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

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

相关文章

第4章 网络层

4.1网络层的功能 1.异网互联:使用路由器连接数据链路层和物理层均不同的网络。【路由器连接的设备物理层&#xff0c;数据链路层和网络层可以不同】 2.转发:从一个端口输入保存后选择另一个端口转发【微观】 3.路由选择:选择合适的路由线路【宏观】 4.SDN的基本概念: 数据平…

【shell】脚本案例2

shell案例&#xff1a; 选择mysql版本 在上面的示例中&#xff0c;没有办法在选择了水果后退出&#xff0c;它会一直让我们选择。如果我们希望选择后就退出&#xff0c;则需要在脚本添加 break 打印九九乘法表 打印三角形&#xff08;10行10列&#xff09; 循环输出0~10之…

目前流行的前端框架有哪些?

目前流行的前端框架有很多&#xff0c;它们可以帮助开发者快速构建高质量的前端应用程序。本文将介绍一些目前比较受欢迎的前端框架&#xff0c;并分析它们的优缺点。 React React 是一个由 Facebook 开发的开源前端JavaScript库&#xff0c;用于构建用户界面&#xff0c;尤其…

Ollama本地运行 Mistral-7B-Instruct-v0.3

Ollama本地运行 Mistral-7B-Instruct-v0.3 0. 引言1. 运行 mistral:7b-instruct-v0.3-q8_02. 简单问个问题 0. 引言 Mixtral 5月23日发布了 Mistral-7B-Instruct-v0.3&#xff0c;支持 function calling&#xff0c;今天简单运行一下。 1. 运行 mistral:7b-instruct-v0.3-q8_…

头歌03-最长公共子序列

给定两个无序的序列 X{x_1,x_2,⋯,x_m } 和 Y{Y_1,Y_2,⋯,Y_n } ,求 X 和 Y 长度最长的公共子序列。 序列的子序列是指&#xff1a;从给定序列中随意地&#xff08;不一定连续&#xff09;去掉若干个字符&#xff08;可能一个也不去掉&#xff09;后所形成的字符序列。如果序列…

【AI如何帮你编写测试用例并输出表格格式】

1、工具&#xff1a;顺便使用一款生成式AI即可&#xff0c;此处用的是ChatGPT&#xff0c;Kimi这两个工具试验。 2、首先要拿到需求文档&#xff0c;根据需求文档向AI发出如下指令&#xff08;Prompt&#xff09; “请根据下面这段需求&#xff0c;编写测试用例&#xff1a; …

在CentOS上手动配置静态IP地址及多网卡路由策略

在管理服务器时&#xff0c;手动配置静态IP地址是一项基本而关键的任务&#xff0c;尤其是在涉及多网卡的复杂网络环境中。静态IP配置确保了服务器的稳定访问&#xff0c;有助于避免由于IP地址动态变化引起的潜在问题。本文将探讨如何在CentOS系统中手动设置静态IP地址&#xf…

python从0开始学习(十二)

目录 前言 1、字符串的常用操作 2、字符串的格式化 2.1 格式化字符串的详细格式&#xff08;针对format形式&#xff09; ​编辑 总结 前言 上一篇文章我们讲解了两道关于组合数据类型的题目&#xff0c;本篇文章我们将学习新的章节&#xff0c;学习字符串及正则表达式。 …

字节跳动(校招)算法原题

大模型"价格战"越演越烈 昨天的 文章 提到&#xff0c;自从 5 月 15 号&#xff0c;字节跳动发布了击穿行业底价的豆包大模型后&#xff0c;各大厂家纷纷跟进降价&#xff0c;而且都不是普通降价&#xff0c;要么降价 90% 以上&#xff0c;要么直接免费。 今天是豆包…

【Linux】centos7下载安装Python3.10,下载安装openssl1.1.1

目录 centos7下载安装Python&#xff08;版本3.10.14&#xff09; &#xff08;1&#xff09;网页下载python压缩包&#xff0c;并解压缩 &#xff08;2&#xff09;编译安装 Python在make altinstall时&#xff0c;报错及解决 &#xff08;3&#xff09;将安装目录和可执…

2024电工杯数学建模A题思路+模型+代码

2024电工杯数学建模A题思路模型代码&#xff0c;开赛后第一时间更新&#xff0c;更新见文末名片 以下为2023年电工杯A提思路&#xff1a; A题: 电采暖负荷参与电力系统功率调节的技术经济分析。 典型住户电采暖负荷用电行为分析&#xff1a; a) 分析典型房间温变过程微分方程…

EM算法求解高斯混合模型参数公式推导

高斯混合模型介绍 高斯混合模型&#xff08;Gaussian Mixture Model&#xff0c;简称GMM&#xff09;是一种经典的概率模型&#xff0c;被广泛应用于数据挖掘、模式识别和机器学习等领域。它采用多个高斯分布组合来对数据进行建模&#xff0c;每个高斯分布对应于数据中的一个子…

ROCm上运行情感分析:使用卷积神经网络

15.3. 情感分析&#xff1a;使用卷积神经网络 — 动手学深度学习 2.0.0 documentation (d2l.ai) 代码 import torch from torch import nn from d2l import torch as d2lbatch_size 64 train_iter, test_iter, vocab d2l.load_data_imdb(batch_size)def corr1d(X, K):w K.s…

分布式任务调度内的 MySQL 分页查询优化

作者&#xff1a;vivo 互联网数据库团队- Qiu Xinbo 本文主要通过图示介绍了用主键进行分片查询的过程&#xff0c;介绍了主键分页查询存在SQL性能问题&#xff0c;如何去创建高效的索引去优化主键分页查询的SQL性能问题。 对于数据分布不均如何发现&#xff0c;提供了一些SQL…

C语言初阶——5操作符

一、算数操作符 除了% 操作符之外&#xff0c;其他的几个操作符可以作用于整数和浮点数。对于/ 操作符如果两个操作数都为整数&#xff0c;执行整数除法。而只要有浮点数执行的就是浮点数除 法。% 操作符的两个操作数必须为整数。返回的是整除之后的余数。 1、类型转换 C语言…

Simplicity Studui V5 新安装后无法Product Updates

之前&#xff08;2021年&#xff09;在SiliconLabs官网下载了SSV5&#xff0c;安装包我也保存在硬盘了&#xff0c;最近换了台电脑安装SSV5后安装 SDK之前必须Product Updates&#xff0c;但死活安装不上&#xff0c;老是提示发生了错误。来来回回卸载安装几十遍&#xff0c;后…

每日新闻掌握【2024年5月24日 星期五】

2024年5月24日 星期五 农历四月十七 TOP大新闻 卫龙因缺斤少两致歉并开展自查 5月23日&#xff0c;卫龙官方账号发布致消费者的一封信。信中提到&#xff1a;针对近日消费者反馈的15g魔芋爽存在克重不足的情况我们表示诚挚的歉意。产品质量是卫龙的重中之重。卫龙已经与相关消…

瓦解信息茧房,IPWO打破“墙”的限制

国外与国内的网络之间隔着一道无形的“墙”&#xff0c;这面“墙”让我们避免了海外不法分子的窥视&#xff0c;保护了我们的网络隐私。但是&#xff0c;“墙”的存在同样阻止了我们访问全球网络&#xff0c;获取海外资源&#xff0c;形成巨大的信息茧房。 越来越多的人渴望撕开…

Plant Simulation 双深位立库开发系列教程-出入口参数化

上一节讲到货架参数化,这一节我们继续讲出入口参数化,先看我们需要达到的效果,在Conveyor增加一个出入口设置功能,用户可以通过该功能设置多个出入口 步骤1:创建ConveyorList 在RackLane中新建一个表格ConveyorList,用于存储用户的设置参数 表格设置名字、类型、方向 、…

c# 基础 .net core、.net framework、c#、mono之间的关系

它们都是微软旗下的产品.NET Framework 主要针对window环境开发&#xff0c;是一套开发框架&#xff0c;它包含了大量的类库和运行时环境&#xff08;CLR&#xff09;&#xff0c;支持多种编程语言&#xff0c;包括 C#。- .NET Framework 的版本&#xff08;如 4.5、4.6、4.7 …