[图片来源BZhan]最小生成树(Prim➕Kruskal)、最短路径(Dijkstra➕Floyd)

文章目录

  • 0.基础知识
    • 0.1图的存储结构
    • 0.2算法复杂度
      • 1.BFS和DFS
      • 2.Prim和Kruskal
  • 1.最小生成树
    • 1.1Prim算法
      • 1.算法思想
      • 2.Prim代码实现
    • 1.2Kruskal算法
      • 1.算法思想
      • 2.Kruskal代码实现[demo]
  • 2.最短路径
    • 2.1问题抽象:
    • 2.2两种常见的最短路径问题:
      • 1.Dijkstra: 单源最短路径O(N^2)
      • 2.Floyd: 所有顶点间的最短路径
        • 法一:Dijkstra执行n次O(N^3)
        • 法二:Floyd (弗洛伊德)算法O(N^3)

0.基础知识

0.1图的存储结构

在这里插入图片描述

0.2算法复杂度

1.BFS和DFS

邻接矩阵表示: 时间复杂度 = O(N^2)
邻接矩阵表示: 时间复杂度 = O(N+E)
空间复杂度均为O(N)

稠密图适于在邻接矩阵上进行深度遍历
稀疏图适于在邻接表_上进行深度遍历

2.Prim和Kruskal

Prim: O(N^2) 稠密图
Kruskal: O(eloge)[边数] 稀疏图
Minimum Spanning Tree: MST

1.最小生成树

1.1Prim算法

1.算法思想

在这里插入图片描述

  1. 所有的顶点被分为两类 被加入到MST的A类 未被加入到MST的B类
  2. 从B类中任选一个顶点V 放入A类 从能跟A类连接且不在MST的这些边中选出一条权值最小的边作为MST的构成部分
  3. V所连的那个顶点入MST 依次2 3直到所有顶点入MST

2.Prim代码实现

在这里插入图片描述

  1. 搞一个结构体数组 下标i表示每个顶点的编号 左域存顶点Vx 表示Vi到Vx 右域存距离 表示Vi到Vx的距离
  2. 从起始点u作为A类的第一个顶点开始 从矩阵中取出B类所有顶点到A类新增顶点(此时是u) 的距离放入对应右域 左域放B类新增顶点 此时结构体数组表示B类所有顶点到A类新增顶点的距离
  3. 在当前结构体数组中取出右域值最小的下标index 表示编号为index的顶点到A类顶点距离最短 Vindex将作为下一个加入A类的顶点 此时第一条路径已求出 输出
  4. Vindex顶点在结构体数组的右域值设0 表示已入A类[0: 已入A类正无穷: 不存在边 其他值: 距离长度]
  5. 遍历矩阵编号为index的那一行 取出每个顶点到Vindex的距离 每个顶点到旧A类顶点距离比较 如果因为Vindex的新加入使得B类顶点到A类顶点出现较小值 则替换 比如:Vj到Vindex距离比Vj到旧顶点距离小 Vj在结构体数组中的左域放Vindex 对应距离也替换
  6. 继续345
#include <iostream>
#define MVNum 10
#define MaxInt 32767 
using namespace std;struct edge
{char adjvex;int lowcost;
}closedge[MVNum];typedef struct 
{char vexs[MVNum];int arcs[MVNum][MVNum];int vexnum, arcnum;
}AMGraph;int LocateVex(AMGraph G, char v)
{for (int i = 0; i < G.vexnum; i++){if (G.vexs[i] == v)return i;}return -1;
}int CreateUDN(AMGraph& G) 
{cin >> G.vexnum >> G.arcnum;for (int i = 0; i < G.vexnum; i++)cin >> G.vexs[i];for (int i = 0; i < G.vexnum; i++){for (int j = 0; j < G.vexnum; j++)G.arcs[i][j] = MaxInt;}for (int k = 0; k < G.arcnum; k++) {char v1, v2;int w;cin >> v1 >> v2 >> w;int i = LocateVex(G, v1);int j = LocateVex(G, v2);if (i != -1 && j != -1) G.arcs[i][j] = G.arcs[j][i] = w;}return 0;
}int Min(AMGraph G)
{int min = MaxInt;int min_index;for (int i = 0; i < G.vexnum; i++){if (closedge[i].lowcost != 0 && closedge[i].lowcost < min){min = closedge[i].lowcost;min_index = i;}}return min_index;
}void Prim(AMGraph G, char u) 
{int index = LocateVex(G, u);for (int i = 0; i < G.vexnum; i++) {if (i != index){closedge[i].adjvex = u;closedge[i].lowcost = G.arcs[index][i];}}//u到u距离为0closedge[index].lowcost = 0;for (int i = 1; i < G.vexnum; i++){index = Min(G);cout << closedge[index].adjvex << "->" << G.vexs[index] << endl;closedge[index].lowcost = 0;for (int j = 0; j < G.vexnum; j++) {if (G.arcs[index][j] < closedge[j].lowcost){closedge[j].adjvex = G.vexs[index];closedge[j].lowcost = G.arcs[index][j];}}}
}int main()
{AMGraph G;CreateUDN(G);char u;cin >> u;Prim(G, u);return 0;
}

1.2Kruskal算法

1.算法思想

在这里插入图片描述

假设只有顶点没有边 从所有的边中取一条权值最小且不会形成环的边 直至构成一棵最小生成树

2.Kruskal代码实现[demo]

2.最短路径

2.1问题抽象:

在有向网中A点(源点)到达B点(终点)的多条路径中,寻找一条各边权值之和最小的路径,即最短路径。

最短路径与最小生成树不同,路径上不一定包含n个顶点,也不一定包含n- 1条边。

2.2两种常见的最短路径问题:

单源最短路径: Dijkstra (迪杰斯特拉) 算法
所有顶点间的最短路径: Floyd (弗洛伊德)算法

1.Dijkstra: 单源最短路径O(N^2)

可以求出V0到V1~V6的分别的最短路径

按路径长度递增次序产生最短路径

在这里插入图片描述在这里插入图片描述

  1. 将所有的顶点分为已在path的A类 和 不在path的B类 从B类中任选一个V作为初始点 V归入A类
  2. 对V分别访问B类所有顶点 能直达的将距离计入数组D(下标i代表顶点编号 值代表V到D[i]的路径) 无法直达的将无穷大计入数组D
  3. 对这次遍历的结果取最小值D[x]作为V到Vx的最短路径并存入数组 作为结果:第一次遍历确定了V到Vx的最短路径且值为D[x] 并将Vx归入A类 此后不再考虑Vx 因为他已进path
  4. 对V分别访问B类所有顶点 如果通过Vx能到达且距离比第一次遍历结果小 将新/小距离替换旧/大距离
  5. 对这次遍历的结果取最小值D[y]作为V到Vy的最短路径并存入数组 作为结果:第二次遍历确定了V到Vy的最短路径且值为D[y] 并将Vy归入A类 此后不再考虑Vy 因为他已进path
  6. 依次执行2345

2.Floyd: 所有顶点间的最短路径

法一:Dijkstra执行n次O(N^3)
法二:Floyd (弗洛伊德)算法O(N^3)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

⑥【bitmap 】Redis数据类型: bitmap [使用手册]

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Redis bitmap ⑥Redis bitmap 基本操作命令1. …

记录一些免费的 API接口

主要记录一些日常开发中可以使用到的一些免费api接口&#xff0c;目前包括 ip地址查询、天气查询 通过 IP 查询地址 ip-api (不支持 https) &#x1f4a1; api接口文档 &#x1f579; 调用接口 $ curl http://ip-api.com/json&#x1f4dd; 返回信息&#xff08;位置信息&…

easyx的基本使用<一>(万字解析)

easyx的基本使用 一.基本框架1.创建文件2.创建窗体-initgraph,closegraph,getchar 二.简单的绘制1.圆形-circle2.坐标系统-setorigin,setaspectratio 三.简单图形1.绘制点-putpixel2.简单的直线-line3.矩形-rectangle4.椭圆-ellipse5.圆角矩形-roundrect6.扇形-pie7.圆弧-arc 四…

ElasticSearch01

ElasticSearch 版本&#xff1a;7.8 学习视频&#xff1a;尚硅谷 笔记&#xff1a;https://zgtsky.top/ ElasticSearch介绍 Elaticsearch&#xff0c;简称为es&#xff0c; es是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b…

JMeter 测试脚本编写技巧

JMeter 是一款开源软件&#xff0c;用于进行负载测试、性能测试及功能测试。测试人员可以使用 JMeter 编写测试脚本&#xff0c;模拟多种不同的负载情况&#xff0c;从而评估系统的性能和稳定性。以下是编写 JMeter 测试脚本的步骤。 第 1 步&#xff1a;创建测试计划 在JMet…

JVM——垃圾回收(方法区中的垃圾回收和(堆回收)自动垃圾回收)

目录 1.自动垃圾回收介绍1.C/C的内存管理2.Java的内存管理3.垃圾回收的对比 2.方法区的回收方法区的回收 – 手动触发回收 3.堆回收1.引用计数法2.可达性分析算法 1.自动垃圾回收介绍 1.C/C的内存管理 ⚫ 在C/C这类没有自动垃圾回收机制的语言中&#xff0c;一个对象如果不再…

C语言—什么是数组名

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int arr[]{1,2,3,4};printf("%p\n",arr);printf("%p\n",&arr);printf("%p\n",*arr);return 0; } 结论&#xff1a;数组名是数组首元素地址&#xff08;下标为0的元素…

Vatee万腾独特科技力量的前沿探索:Vatee的数字化奇点

在当今科技的浪潮中&#xff0c;Vatee万腾以其独特的科技力量成为前沿探索的引领者&#xff0c;正迎来数字化奇点的新时代。Vatee万腾不仅仅是一家科技公司&#xff0c;更是一支探索未知领域、开创数字时代新局面的先锋力量。 Vatee万腾的数字化奇点体现在其对前沿技术的深刻理…

MFC设置单选按钮点击自己可以可选和不可选

mfc是c的一个框架&#xff0c;可谓是经久不衰。最近博主遇到一个问题&#xff0c;就是单选按钮点击自己可以设置可选和不可选&#xff0c;貌似类似复选框一样&#xff0c;但领导分发的任务上要求的是用单选按钮实现复选框这种类似功能&#xff0c;实现效果类似如下图&#xff1…

【Java】认识异常

文章目录 一、异常的概念和体系结构1.异常的概念2.异常的体系结构3.异常的分类 二、异常的处理1.防御式异常2.异常的抛出3.异常的捕捉 三、异常的处理流程四、自定义异常类 一、异常的概念和体系结构 1.异常的概念 在Java中&#xff0c;将程序执行过程中发生的不正常行为称为…

Redis实战篇(一)短信登录

Redis实战篇&#xff08;一&#xff09;短信登录 1.1、导入黑马点评项目 1.1.1 、导入SQL 1.1.2、有关当前模型 手机或者app端发起请求&#xff0c;请求我们的nginx服务器&#xff0c;nginx基于七层模型走的事HTTP协议&#xff0c;可以实现基于Lua直接绕开tomcat访问redis&a…

截图转HTML代码,支持预览,前端不用浪费时间写html和css了

截图转代码 试用地址&#xff1a;https://picoapps.xyz/free-tools/screenshot-to-code 这个简单的应用可以将截图转换为HTML/Tailwind CSS代码。它使用GPT-4 Vision来生成代码&#xff0c;并使用DALL-E 3来生成类似的图像。现在你也可以输入一个URL来克隆一个现有的网站&#…

RuntimeError: CUDA error: device-side assert triggered

背景&#xff1a; 使用SAGEConv卷积层的图神经网络&#xff0c;网络架构如下 原因&#xff1a; 我在卷积层之前改变了特征矩阵的维度&#xff0c;原本为[172,1,32] 现在改为了 [172,2,32]。导致了特征矩阵x在进行 “x x.squeeze(1)” 操作时并没有将第二向量值去除&#xff08…

蓝桥杯每日一题2023.11.25

题目描述 “蓝桥杯”练习系统 (lanqiao.cn) 题目分析 对于此题目最开始是递归想法&#xff0c;但发现题意中的匹配次数实际上是指在这8个字母中这8个字母每个字母对应的个数是否相同&#xff0c;如果相同则匹配。 此处我们可以使用subsrtr函数&#xff0c;每次循环截取8个字…

印刷基板开孔机上的直线导轨怎么安装?

直线导轨是属于高精度的传动元件&#xff0c;作为印刷基板开孔机重要的传动元件&#xff0c;倘若安装不当&#xff0c;严重则无法正常作业&#xff0c;轻则影响直线导轨的精度和寿命。那么&#xff0c;印刷基板开孔机的直线导轨是如何安装的呢&#xff1f; 在安装前&#xff0c…

中通单号查询,中通快递物流查询,将途经指定城市的单号筛选出来

批量查询中通快递单号的物流信息&#xff0c;并将途经指定城市的单号筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 中通快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的朋友记得先注册&#x…

【差旅游记】走进新疆哈密博物馆

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 前些天在新疆哈密时&#xff0c;有天下午有点时间&#xff0c;看离住的宾馆不远就是哈密博物馆&#xff0c;便去逛了逛博物馆&#xff0c;由于接下来的一段时间没顾上记录&#xff0c;趁今天有些时间简单记录下那短暂的…

STM32 CAN协议讲解以及代码

STM32 CAN 文章目录 STM32 CAN前言一、CAN外设1.主控制寄存器CAN_MCR2.位时序寄存器CAN_BTR3.CAN的发送邮箱4.CAN的接收FIFO5.验收筛选器 二、代码配置1.初始化2.发送数据3.接收数据4.main.c 前言 前面学习了CAN的一些理论知识&#xff0c;他在我们的STM32里面是怎么用的呢 前…

【手写实现一个简单版的Dubbo,深刻理解RPC框架的底层实现原理】

手写实现一个简单版的Dubbo&#xff0c;深刻理解RPC框架的底层实现原理 RPC框架简介了解Dubbo的实现原理服务暴露服务引入服务调用 手写实现一个简单版的Dubbo服务暴露ServiceBeanProxyFactory#getInvokerProtocol#exportRegistryProtocol#export 服务引入RegistryProto#referD…

matlab画双坐标图的样式

matlab画双坐标图的样式 %% clc,clear,close all; t0:0.1:9*pi; figure; [AX,Ha,Hb]plotyy(t,sin(t),t,exp(t)); % 绘图并创建句柄 % ----------------- 设置刻度 set(AX(1),yTick,[-1.250:0.25:1.25]) % 设置左边Y轴的刻度 set(AX(2),yTick,[0:50:350]) …