数据结构 | 图的最短路径 Floyd算法

一、数据结构定义

typedef int VertexType;
typedef int EdgeType;/*图*/
typedef struct {VertexType Vexs[SIZE];		//结点 EdgeType Edges[SIZE][SIZE];	//权值 int vexnum, arcnum;
}MGraph;/*路径*/
typedef struct {int path[SIZE][SIZE];EdgeType length;
}Path;

1.二维数组 Edges[SIZE][SIZE] 储存图的边权数据,一维数组 Vexs[SIZE] 储存图的结点数据;

2.结构体 Path 保存计算后的路径信息。

二、算法详解

/* 初始化图并输入权值 */
MGraph* InitGraph() {MGraph* G = (MGraph*)malloc(sizeof(MGraph));G->vexnum = 4;G->arcnum = 8;//初始化图的邻接矩阵 Edges[SIZE][SIZE]for (int i = 0; i < G->vexnum; i++) {for (int j = 0; j < G->vexnum; j++) {if (i == j)	G->Edges[i][j] = 0;		//对角线权值为0 else		G->Edges[i][j] = MaxNum;	//除对角线外所有权值为无穷大 }}//初始化图的结点矩阵 Vexs[SIZE]VertexType v[4] = { 0,1,2,3 };for (int i = 0; i < G->vexnum; i++)G->Vexs[i] = v[i];//初始化图的边权int  start_vex[8] = { 0,0,1,1,2,2,2,3 };int    end_vex[8] = { 1,3,2,3,0,1,3,2 };int vex_weight[8] = { 5,7,4,2,3,3,2,1 };for (int i = 0; i < G->arcnum; i++)G->Edges[start_vex[i]][end_vex[i]] = vex_weight[i];return G;
}/* 初始化路径矩阵 */
Path InitPath() {Path path;path.length = 0;return path;
}/* Floyd算法寻找最短路径 */
void Floyd(MGraph* Graph, Path *path) {int i, j, k, nun = Graph->vexnum;int temp[SIZE][SIZE];// 初始化for (i = 0; i < nun; i++) {for (j = 0; j < nun; j++) {temp[i][j] = Graph->Edges[i][j];path->path[i][j] = -1;}}// 算法主体for (k = 0; k < nun; k++) {for (i = 0; i < nun; i++) {for (j = 0; j < nun; j++) {if (temp[i][j] > temp[i][k] + temp[k][j]) {temp[i][j] = temp[i][k] + temp[k][j];path->path[i][j] = k;}}}}
}

三、运行结果

        main方法代码如下:

int main() {MGraph* Graph = InitGraph();Path path = InitPath();Floyd(Graph, &path);PrintPath(Graph, &path);return 0;
}

 

四、源代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>#define SIZE 4          //邻接矩阵大小(v0 - v3)
#define MaxNum 999      //不可到达点的权值(即无穷大)typedef int VertexType;
typedef int EdgeType;/*图*/
typedef struct {VertexType Vexs[SIZE];		//结点 EdgeType Edges[SIZE][SIZE];	//权值 int vexnum, arcnum;
}MGraph;/*路径*/
typedef struct {int path[SIZE][SIZE];EdgeType length;
}Path;/* 初始化图并输入权值 */
MGraph* InitGraph() {MGraph* G = (MGraph*)malloc(sizeof(MGraph));G->vexnum = 4;G->arcnum = 8;//初始化图的邻接矩阵 Edges[SIZE][SIZE]for (int i = 0; i < G->vexnum; i++) {for (int j = 0; j < G->vexnum; j++) {if (i == j)	G->Edges[i][j] = 0;		//对角线权值为0 else		G->Edges[i][j] = MaxNum;	//除对角线外所有权值为无穷大 }}//初始化图的结点矩阵 Vexs[SIZE]VertexType v[4] = { 0,1,2,3 };for (int i = 0; i < G->vexnum; i++)G->Vexs[i] = v[i];//初始化图的边权int  start_vex[8] = { 0,0,1,1,2,2,2,3 };int    end_vex[8] = { 1,3,2,3,0,1,3,2 };int vex_weight[8] = { 5,7,4,2,3,3,2,1 };for (int i = 0; i < G->arcnum; i++)G->Edges[start_vex[i]][end_vex[i]] = vex_weight[i];return G;
}/* 初始化路径矩阵 */
Path InitPath() {Path path;path.length = 0;return path;
}/* Floyd算法寻找最短路径 */
void Floyd(MGraph* Graph, Path *path) {int i, j, k, nun = Graph->vexnum;int temp[SIZE][SIZE];// 初始化for (i = 0; i < nun; i++) {for (j = 0; j < nun; j++) {temp[i][j] = Graph->Edges[i][j];path->path[i][j] = -1;}}// 算法主体for (k = 0; k < nun; k++) {for (i = 0; i < nun; i++) {for (j = 0; j < nun; j++) {if (temp[i][j] > temp[i][k] + temp[k][j]) {temp[i][j] = temp[i][k] + temp[k][j];path->path[i][j] = k;}}}}
}/* 递归寻找最短路径 */
void FindPath(int start, int end, Path* path, MGraph* Graph) {if (path->path[start][end] == -1) {printf("-> %d ", end);path->length = path->length + Graph->Edges[start][end];}else {int mid = path->path[start][end];FindPath(start, mid, path, Graph);FindPath(mid, end, path, Graph);}
}/* 打印最短路径 */
void PrintPath(MGraph* Graph, Path* path) {VertexType start, end;printf("输入起点:");scanf("%d", &start);printf("输入终点:");scanf("%d", &end);printf("%d ", start);FindPath(start, end, path, Graph);printf("= %d", path->length);
}int main() {MGraph* Graph = InitGraph();Path path = InitPath();Floyd(Graph, &path);PrintPath(Graph, &path);return 0;
}

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

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

相关文章

微服务 云原生:微服务相关技术简要概述

后端架构演进 单体架构 所谓单体架构&#xff0c;就是只有一台服务器&#xff0c;所有的系统、程序、服务、应用都安装在这一台服务器上。比如一个 bbs 系统&#xff0c;它用到的数据库&#xff0c;它需要存储的图片和文件等&#xff0c;统统都部署在同一台服务器上。 单体架…

白皮书案例解读|数字孪生与港口的结合会碰撞出什么样的火花呢?

以下案例来自于《数字孪生世界白皮书&#xff08;2023版&#xff09;》 领取方式&#xff1a;公众号「EasyV数字孪生」后台回复「白皮书」即可领取&#xff01; 嗨&#xff0c;我又出现啦&#xff5e;今天想和大家聊聊关于港口场景数字孪生技术的应用&#xff0c;欢迎大家踊跃…

基于JavaSwing+MySQL的仓库商品管理系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88046204?spm1001.2014.3001.5503 JDK1.8 MySQL5.7 功能&#xff1a;管理员与员工两个角色登录&#xff0c;增删改查用户信息&#xff0c;修改密码&#xff0c;增删改查商品信息&#xff0c…

opencv基础:环境配置

最近人工智能很火&#xff0c;所以蹭个热度&#xff0c;聊一个跨平台计算机视觉库----Opencv。 定义 先看一下其定义&#xff1a; OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、…

vue3中的excel表导出功能(选中导出或导出所有,也可支持vue2)

1.安装模块 npm install xlsx file-saver -S 2.文件导入 import * as XLSX from "xlsx"; import FileSaver from "file-saver" 3.整体代码(可选中导出或导出所有) <template><div><el-button type"warning" click"down&quo…

5.2 基于ROP漏洞挖掘与利用

通常情况下栈溢出可能造成的后果有两种&#xff0c;一类是本地提权另一类则是远程执行任意命令&#xff0c;通常C/C并没有提供智能化检查用户输入是否合法的功能&#xff0c;同时程序编写人员在编写代码时也很难始终检查栈是否会发生溢出&#xff0c;这就给恶意代码的溢出提供了…

Maven引入Jacoco插件后无法生成jacoco.exec执行文件

目录 jacoco.exec网上常见关于未生成jacoco.exec原因最终解决方案不生效原因解决方案 完整jacoco插件配置 jacoco.exec 执行数据文件&#xff0c;只有生成该文件&#xff0c;才表示引入插件jacoco成功生效 网上常见关于未生成jacoco.exec原因 网上找了一下解决方式基本都是…

React Dva修改路由设置,不要井号

我们Dva项目的路由 他默认是设置了带井号的这种 其实我觉得到还可以 但是有些人会觉得不太美观 如果 你想去除他 那么 你先要在终端执行 npm install --save history将 history 引入进来 装好之后 我们来到src下的 index.js 加上如下代码 import {createBrowserHistory as …

C 13300000000 代表 C 呼入电话

先欣赏一个美图吧 给一个序列 C 13300000000 代表 C 呼入电话 &#xff0c;电话号码 13300000000 W 037128* 代表 W 白名单 &#xff0c;后面可以模糊匹配&#xff0c;而且保证出现在最后一个 如果呼入时电话在白名单中&#xff0c;则可以呼入&#xff0c;否则拒绝 请按输…

拖拽示教功能块(含算法介绍和完整SCL ST源代码)

这篇博客介绍简单拖拽示教功能的简单原理,在了解示教功能之前大家需要熟悉运动控制相关的内容,这篇博客我们以脉冲驱动为例介绍,所以大家可以先熟悉下脉冲控制功能块,有关运动控制的相关内容,可以查看运动控制专栏,主要链接如下: SMART PLC和V90伺服实现外部脉冲位置控…

ELK插件介绍

ELK插件介绍 一、Grok 正则捕获插件1、概述2、内置正则表达式调用3、自定义表达式调用 二、multiline 多行合并插件1、概念2、安装3、使用 multiline 插件 三、date 时间处理插件1、概念2、操作3、时间戳详解 四、mutate 数据修改插件1、概念2、案例 一、Grok 正则捕获插件 1、…

java项目之多人命题系统(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的多人命题系统。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&…