数据结构-图的最小生成树

最小生成树介绍

最小生成树(Minimum Cost Spanning Tree)是代价最小的连通网的生成树,即该生成树上的边的权值和最小

最小生成树的性质:

必须使用且仅使用连通网中的n-1条边来联结网络中的n个顶点;

不能使用产生回路的边;

各边上的权值的总和达到最小

最小生成树在连通网场景中应用广泛,例如

在n个城市之间建立通信网络,如何建立成本最小的网络

在n个城市之间建立公路网络,如何建立成本最小的网络

应用场景:“村村通”,我国系统工程,全国行政村互通:公路、电力、生活和饮用水、电话网、有线电视网、互联网等等

村村通公路,村村通水气电,村村通5G,村村通宽带

2025年全国基本实现村村通

Prim算法

普里姆(Prim)算法设计

假设N=(V,E)是连通网

TE是N上最小生成树中边的集合

  1.U={u0},(u0ÎV), TE={}

  2.在所有uÎU,vÎV-U的边(u,v)ÎE中找一条代价最小的边(u,v0)并入集合TE,同时v0并入U

  3.重复2,直到U=V

算法示例

        普里姆(Prim)算法设计思想:每次找到的最小权值边,一头属于已选顶点U,一头属于未选顶点V-U设置一个辅助数组closedge,用于保存未选顶点的最小权值边closedge,而且这条边的另一个点必然输入已选顶点

推导流程

普里姆(Prim)算法分析

从算法看出,算法只是和顶点数量相关,与边无关

时间复杂度为O(n2)

普里姆适用于边稠密的网,

当一个通信网的点数量少但边数量多,则用普里姆

参考设计代码

class Edge {
public:string begin;string end;int weight;
};
//!!!!!!!!普里姆算法!!!!!!!!!void Prim() {Edge *q = new Edge[l];string s;cin >> s;int start = find(s);for (int i = 0; i < l; i++) {arr[i][start] = 0;}int k = 0;int next;int remain = l - 1;while (remain > 0) {arr[start][l] = 1;int min = 0xffff;for (int i = 0; i < l; i++) {if (arr[i][l] == 1) {for (int j = 0; j < l; j++) {if (arr[i][j] < min && arr[i][j] != 0) {min = arr[i][j];start = i;next = j;}}}}q[k].begin = str[start];q[k].end = str[next];q[k].weight = arr[start][next];sum += arr[start][next];k++;for (int i = 0; i < l; i++) {arr[i][next] = 0;}remain--;start = next;}cout << sum << endl;cout << "prim:" << endl;for (int i = 0; i < k; i++)cout << q[i].begin << ' ' << q[i].end << ' ' << q[i].weight << endl;}

 

Kruskal算法

最小生成树生成算法——克鲁斯卡尔(Kruskal)算法

假设G=(V,E)是连通网,设非连通图T={V,{}},图中每个顶点自成一个连通分量

1.在E中找一条代价最小,且其两个顶点分别依附不同的连通分量的边,将其加入T中

2.重复1,直到T中所有顶点都在同一连通分量上

算法示例

算法设计

 克鲁斯卡尔算法设计用选择排序算法,只需要即找出n-1条符合要求的边

难点:如何判断一条边属于两个不同的连通分量

设计辅助数组Belong[n],其中Belong[i]初始为-1,表示顶点i未选

当选中一条边,查看这条边的两个顶点i和j

如果Belong[i]和Belong[j]都是-1,则生成新分量编号并设Belong[i]和Belong[j]

如果Belong[i]或Belong[j]是-1,则生成新分量编号并设Belong[i]或Belong[j]

如果Belong[i]或Belong[j]都不是-1,则说明两个顶点已选

如果Belong[i]==Belong[j],则说明同属一个分量,放弃

如果Belong[i]<>Belong[j],则说明分属不同分量,选择这条边并把两个分量合并,即更改相关分量的Belong值 

 算法分析

算法只是和边数量相关,因此适用于点稠密的网

时间复杂度为O(eloge)

当一个通信网的边数量少但点数量多,则适用

参考代码 

//克鲁斯卡尔算法执行结点
class edge {
public:int begin;int end;int weight;
};//!!!!!!!克鲁斯卡尔算法!!!!!void Kurskal() {for (int i = 0; i < l; i++)flag[i] = 0;cout << "kruskal:" << endl;//将所获得边集数组进行排序for (int i = 0; i < t; i++)for (int j = 0; j < t - i - 1; j++) {if (e[j].weight > e[j + 1].weight)swap(e[j], e[j + 1]);}for (int i = 0; i < l; i++) {int o = find(e[i].begin);int p = find(e[i].end);if (o != p) {flag[o] = p;cout << str[e[i].begin] << ' ' << str[e[i].end] << ' ' << e[i].weight << endl;}}}

 

完整代码(仅供参考)
#include<iostream>
#include<queue>#define nu 0xffff;
using namespace std;class node {
public:int info;node *next;node() {next = nullptr;}
};class point {
public:int data;node *head;point() {head = nullptr;}
};//克鲁斯卡尔算法执行结点
class edge {
public:int begin;int end;int weight;
};class Edge {
public:string begin;string end;int weight;
};class graph {
private:int l, t;int **arr;string *str;int *flag;edge *e;int sum = 0;point *a;int n, m;
public:graph() {Create();}//邻接矩阵存储void Create() {cin >> l;str = new string[l];flag = new int[l];arr = new int *[l + 1];for (int i = 0; i < l; i++) {flag[i] = 0;arr[i] = new int[l];}for (int i = 0; i < l; i++)for (int j = 0; j < l; j++)arr[i][j] = nu;for (int i = 0; i < l; i++)cin >> str[i];cin >> t;for (int i = 0; i < t; i++) {string o, p;int num;cin >> o >> p >> num;int oo = find(o), pp = find(p);arr[oo][pp] = arr[pp][oo] = num;e[i].begin = oo;e[i].end = pp;e[i].weight = num;}for (int i = 0; i < l; i++) {for (int j = 0; j < l; j++)cout << arr[i][j] << ' ';cout << endl;}}//克鲁斯卡尔算法int find(int i) {while (flag[i] > 0)i = flag[i];return i;}int find(const string &ss) {for (int i = 0; i < l; i++)if (str[i] == ss)return i;return -1;}//!!!!!!!克鲁斯卡尔算法!!!!!void Kurskal() {for (int i = 0; i < l; i++)flag[i] = 0;cout << "kruskal:" << endl;//将所获得边集数组进行排序for (int i = 0; i < t; i++)for (int j = 0; j < t - i - 1; j++) {if (e[j].weight > e[j + 1].weight)swap(e[j], e[j + 1]);}for (int i = 0; i < l; i++) {int o = find(e[i].begin);int p = find(e[i].end);if (o != p) {flag[o] = p;cout << str[e[i].begin] << ' ' << str[e[i].end] << ' ' << e[i].weight << endl;}}}//!!!!!!!!普里姆算法!!!!!!!!!void Prim() {Edge *q = new Edge[l];string s;cin >> s;int start = find(s);for (int i = 0; i < l; i++) {arr[i][start] = 0;}int k = 0;int next;int remain = l - 1;while (remain > 0) {arr[start][l] = 1;int min = 0xffff;for (int i = 0; i < l; i++) {if (arr[i][l] == 1) {for (int j = 0; j < l; j++) {if (arr[i][j] < min && arr[i][j] != 0) {min = arr[i][j];start = i;next = j;}}}}q[k].begin = str[start];q[k].end = str[next];q[k].weight = arr[start][next];sum += arr[start][next];k++;for (int i = 0; i < l; i++) {arr[i][next] = 0;}remain--;start = next;}cout << sum << endl;cout << "prim:" << endl;for (int i = 0; i < k; i++)cout << q[i].begin << ' ' << q[i].end << ' ' << q[i].weight << endl;}};

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

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

相关文章

Linux部署幻兽帕鲁服务器,PalWorld开服联机教程,保姆级教程

------另一个号申请积分-------- Linux系统搭建PalWorld私服&#xff0c;幻兽帕鲁开服联机教程&#xff0c;保姆级教程 最近这游戏挺火&#xff0c;很多人想跟朋友联机&#xff0c;如果有专用服务器&#xff0c;就不需要房主一直开着电脑&#xff0c;稳定性也好得多。 幻兽帕…

Kubernetes operator(五)api 和 apimachinery 篇

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列第五篇&#xff0c;主要对 k8s.io/api 和 k8s.io/apimachinery 两个项目 进行学习基于 kubernetes v1.24.0 代码分析Kubernetes operator学习系列 快捷链接 Kubernetes operator&a…

大数据StarRocks(九):资源隔离实战

前言 自 2.2 版本起&#xff0c;StarRocks 支持资源组管理&#xff0c;集群可以通过设置资源组&#xff08;Resource Group&#xff09;的方式限制查询对资源的消耗&#xff0c;实现多租户之间的资源隔离与合理利用。在 2.3 版本中&#xff0c;StarRocks 支持限制大查询&#…

Android配置GitLab CI/CD持续集成,Shell版本的gitlab-runner,FastLane执行,上传蒲公英

mac环境下&#xff0c; 首选需要安装gitlab-runner和fastlane brew install gitlab-runner brew install fastlane 安装完成&#xff0c;来到我们在gitlab下新建的Android项目&#xff0c;我们开始创建gitlab-runner 1、创建runner 点开runner&#xff0c;点击新建runner …

自然语言nlp学习四

5-5 BMTrain--ZeRO_哔哩哔哩_bilibili 5-6 BMTrain--Pipeline Parallel (流水线并行)_哔哩哔哩_bilibili 5-12 BMCook--背景介绍_哔哩哔哩_bilibili 5-20 BMInf--背景介绍_哔哩哔哩_bilibili 6-7 机器问答--QA介绍_哔哩哔哩_bilibili 6-8 机器问答--阅读理解_哔哩哔哩_bilibili…

常用API1 ---Math

包含用于执行基本数学运算的方法&#xff0c;如初等指数、对数、平方根和三角函数。 常用方法&#xff1a; package MyApi.a01mathdemo01;public class MathDemo01 {public static void main(String[] args) {//abs 获取参数的绝对值System.out.println(Math.abs(-88));System…

江科大stm32学习笔记10——对射式红外传感器

一、接线 上电之后可以看到对射式红外传感器亮两个灯&#xff0c;如果此时用挡光片挡住两个黑色方块中间的部分&#xff0c;则只亮一个灯。 二、代码 将4-1的工程文件夹复制粘贴一份&#xff0c;重命名为“5-1 对射式红外传感器计次”&#xff0c;打开keil&#xff0c;右键添…

认识 SYN Flood 攻击

文章目录 1.什么是 SYN Flood 攻击&#xff1f;2.半连接与全连接队列3.如何防范 SYN Flood 攻击&#xff1f;参考文献 1.什么是 SYN Flood 攻击&#xff1f; SYN Flood 是互联网上最原始、最经典的 DDoS&#xff08;Distributed Denial of Service&#xff09;攻击之一。 SYN…

[C#][opencvsharp]opencvsharp sift和surf特征点匹配

SIFT特征和SURF特征比较 SIFT特征基本介绍 SIFT(Scale-Invariant Feature Transform)特征检测关键特征&#xff1a; 建立尺度空间&#xff0c;寻找极值关键点定位&#xff08;寻找关键点准确位置与删除弱边缘&#xff09;关键点方向指定关键点描述子 建立尺度空间&#xff0…

SpringBoot RestTemplate 设置挡板

项目结构 代码 BaffleConfig /*** Description 记录配置信息* Author wjx* Date 2024/2/1 14:47**/ public interface BaffleConfig {// 是否开启挡板的开关public static boolean SWITCH true;// 文件根目录public static String ROOT_PATH "D:\\TIS\\mock";// …

最新2024如何解决谷歌浏览器Chrome谷歌翻译无法使用问题

快速恢复谷歌浏览器一键翻译功能在Chrome 中安装好【翻译】插件 Macbook 操作步骤&#xff1a; 1点击“前往”&#xff0c;打开“前往文件夹” 2 在对话框中输入“/etc” 囝找到“hosts”文件&#xff0c;复制粘贴到桌面 3 在复制的文件最后新起一行&#xff0c;输入并保存&am…

VUE3+TS使用OpenSeadragon学习之旅,实现多图片切换效果

1.官方网站&#xff1a;OpenSeadragon 2.使用npm下载插件&#xff1a;npm install openseadragon 3.在 index.html文件引入资源 <link rel"stylesheet" href"node_modules/openseadragon/build/openseadragon/openseadragon.css" /><script src…

消息队列的应用场景

消息队列的应用场景 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问题实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构使用较多的消息队列有ActiveMQ&#xff0c;RabbitMQ&#xff0c;Ze…

用户界面(UI)、用户体验(UE)和用户体验(UX)的差异

对一个应用程序而言&#xff0c;UX/UE (user experience) 设计和 UI (user interface) 设计非常重要。UX设计包括可视化布局、信息结构、可用性、图形、互动等多个方面。UI设计也属于UX范畴。正是因为三者在一定程度上具有重叠的工作内容&#xff0c;很多从业多年的设计师都分不…

ffmpeg合成mp3音频,解决音频属性不一致问题

1. 需求&#xff0c;amr转成mp3&#xff0c;再将此mp3和其他mp3合成 2. 问题&#xff1a;拼接后的第一段音频可以播放&#xff0c;第二段自动跳过&#xff0c;无法播放。 3. 解决&#xff1a; 3.1 查看各文件属性 # 查看amr转为mp3文件的属性&#xff1a;ffprobe 文件名&am…

嵌入式软件工程师面试题——2025校招社招通用(C/C++)(五十一)

说明&#xff1a; 面试群&#xff0c;群号&#xff1a; 228447240面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但…

C语言实现12种排序算法

1.冒泡排序 思路&#xff1a;比较相邻的两个数字&#xff0c;如果前一个数字大&#xff0c;那么就交换两个数字&#xff0c;直到有序。 时间复杂度&#xff1a;O(n^2)&#xff0c;稳定性&#xff1a;这是一种稳定的算法。 代码实现&#xff1a; void bubble_sort(int arr[],…

Redis的bitmap使用不当,我内存爆了

背景 最近发现Redis的内存持续暴涨&#xff0c; 涨的有点吓人&#xff0c;机器都快扛不住了&#xff0c;不得不进行Redis内存可视化分析&#xff0c;发现大量的String类型的大key 经分析&#xff0c;最近上线了页面UV的统计&#xff0c;那目前如何做的呢&#xff1f; 通过访…

Redux状态管理(运行机制及实例)

背景&#xff1a; JavaScript需要管理的状态越来越多&#xff0c;越来越复杂;这些状态包括服务器返回的数据、缓存数据、用户操作产生的数据等等&#xff0c;也包括一些UI的状态&#xff0c;比如某些元素是否被选中&#xff0c;是否显示加载动效&#xff0c;当前分页。 状态之…

浅谈信号完整性分析

什么是信号完整性?在过去的低速时代,电平跳变时信号上升时间较长,通常几个 ns。器件间的互连线不至于影响电路的功能,没必要关心信号完整性问题。但在今天的高速时代,随着 IC输出开关速度的提高,很多都在皮秒级,不管信号周期如何,几乎所有设计都遇到了信号完整性问题。…