数据结构实验任务六 :基于 Dijsktra 算法的最短路径求解

news2025/2/27 8:48:24

本次代码为实验六:基于 Dijsktra 算法的最短路径求解实现。本实验的重点在于对于Dijsktra算法的理解。有关Dijsktra的资料可以参考有关博文:

图论:Dijkstra算法——最详细的分析,图文并茂,一次看懂!-CSDN博客

以下附上实现代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MaxE 5
#define MVNum 100
#define MaxInt 32767
typedef struct{
	char vex[MVNum]; //顶点表
	int arcs[MVNum][MVNum];//邻接矩阵,权重为整数
	int Vexnum;//顶点数
	int arcnum; //边数 
}AMGraph;
//全局变量部分 
int cunt=0;							//为存储矩阵计数 
int store[MaxE][MVNum];				//存储结果矩阵 ,每个结果数组的第一位位存最短路径值,后面为路径节点 
int ismin[MVNum];					//记录该几点是否已为最小值 
//函数定义部分
void Dijsktra(AMGraph *a,char s,char e);
void Init(AMGraph *a);
int Read(AMGraph *a); 
void Cal(AMGraph *a);
void show(int a[]);
int getIndex(AMGraph *a,char c);
//函数部分 
void Init(AMGraph *a){				//初始化图和存储数组 
	a->arcnum=0;
	a->Vexnum=0;
	for(int i=0;i<MVNum;i++){
		for(int j=0;j<MVNum;j++){
			a->arcs[i][j]=MaxInt;
		}
	}
	for(int i=0;i<MVNum;i++){
		a->vex[i] = 0;
		store[cunt][i] = 0;
		ismin[i] = 0;
	}
}
int getIndex(AMGraph *a,char c){			//获取节点在图中的位置 
	int rs;
	for(int i=0;i<a->Vexnum;i++){
		if(c==a->vex[i])return i;
	}
}
void show(int a[]){							//输出数据 
	printf("\n[RES]:\n");
	printf("最短距离:%d\n",a[0]);					//第一位为数字,直接输出 
	printf("最短路径:%c",a[1]);
	for(int i=2;i<MVNum;i++){					//后面皆为字符; 
			if(a[i] == 0){
			break;
			}
		printf("->%c",a[i]);
	} 
}
void Dijsktra(AMGraph *a,char s,char e){
	int min=0;//记录每一趟的最小值以及该节点 
	char minv;
	int *lgti = (int*)malloc(sizeof(int)*a->Vexnum);		//该数组用于更新节点节点的最短路径
	char ** lgtc = (char**)malloc(sizeof(char*)*a->Vexnum);	//该数组用于保存每个节点当前最短路径
	for(int i=0;i<a->Vexnum;i++){							//初始化 
		lgtc[i]=(char*)malloc(sizeof(char)*a->Vexnum);
		lgtc[i][0] = s;
		for(int j=1;j<a->Vexnum;j++)lgtc[i][j]=0;
		lgti[i] = MaxInt;
	}
	minv=s;
	
	for(int i=0;i<a->Vexnum-1;i++){				//每次确定一个最小路径,最多共需v-1趟完成
		for(int j=0;j<a->Vexnum;j++){			//每趟对v个节点路径进行更新 
		//printf("\n%c:new =%d,old =%d\n",a->vex[j],min+a->arcs[getIndex(a,minv)][j],lgti[j]);
			if(min+a->arcs[getIndex(a,minv)][j]<lgti[j]){		//若更新节点值小于现有最小值,则更新为改值  
				lgti[j]  = min+a->arcs[getIndex(a,minv)][j];
				strcpy(lgtc[j],lgtc[getIndex(a,minv)]);
				lgtc[j][strlen(lgtc[j])] = a->vex[j]; 
			}
		}
		
		min = MaxInt;
		printf("[TRV %d]:",cunt+1);		
		for(int j=0;j<a->Vexnum;j++){
			if(lgti[j]<min&&ismin[j]==0){					//若小于min且未定为最小值,则记录 
				min = lgti[j];
				minv = a->vex[j];
			}
		}
		printf("新增最小路径: %c\n",minv);
		if(minv==e){
			printf("Success!\n");
			store[cunt][0] = min;
			for(int i=0;i<strlen(lgtc[getIndex(a,e)]);i++){
				store[cunt][i+1]=(int)lgtc[getIndex(a,e)][i];
			}
			cunt++;
			break; 
		}
		ismin[getIndex(a,minv)]=1;
	}
}
void Cal(AMGraph *a){							//计算结果,Dijsktra
	char start,end;
	getchar();										//结果存储 
	printf("请输入起始节点: ");
	scanf(" %c %c",&start,&end);
	Dijsktra(a,start,end);
} 
int Read(AMGraph *a){				//读取数据 
	int n,m,lgt;
	char ca,cb; 
	printf("请输入n,m:"); 
	scanf("%d%d",&n,&m);
	if(n==0&&m==0)return 1;
	a->Vexnum = n;
	a->arcnum =m;
	printf("请输入顶点:");
	for(int i=0;i<n;i++){
		scanf(" %c",&a->vex[i]);				//储存节点 
	}
	getchar(); 
	printf("请输入边: \n");
	for(int i=0;i<m;i++){			//存储边							
		scanf(" %c %c %d",&ca,&cb,&lgt);
		a->arcs[getIndex(a,ca)][getIndex(a,cb)]=lgt;
	}
	return 0; 
}



int main(){
	int flag=0;						//记录是否输入停止 
	AMGraph *a = (AMGraph*)malloc(sizeof(AMGraph));
	printf("多组数据,每组数据有 m+3 行。\n第一行为两个整数 n 和 m,分别代表城市个数 n 和路径条数 m。\n第二行有 n 个字符,代表每个城市的名字。\n第三行到第m+2 行每行有两个字符 a 和 b 和一个整数 d,代表从城市 a 到城市 b 有一条距离为 d 的路。\n最后一行为两个字符,代表待求最短路径的城市起点和终点。\n当 n 和m 都等于 0 时,输入结束");
	while(1){
		Init(a);					//初始化图 
		printf("\n                  =================|    -FZC-    |===============                 \n\n");
		flag = Read(a);			//读取信息
		if(flag==1){
			printf("\n                  =================|    -FZC-    |===============                 \n\n");
			printf("\nFOLLOWING OUTPUI:\n");
			printf("共寻径[%d]次\n",cunt);
			for(int i=0;i<cunt;i++)show(store[i]);
			break; 
		}
		Cal(a);					//计算距离并存储结果 
	}
	return 0;
} 

以上代码仅供参考,欢迎交流。

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

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

相关文章

[LeetCode周赛复盘] 第 374 场周赛20231203

[LeetCode周赛复盘] 第 374 场周赛20231203 一、本周周赛总结100144. 找出峰值1. 题目描述2. 思路分析3. 代码实现 100153. 需要添加的硬币的最小数量1. 题目描述2. 思路分析3. 代码实现 100145. 统计完全子字符串1. 题目描述2. 思路分析3. 代码实现 100146. 统计感冒序列的数…

USART的PAL库编程

USART驱动的工作原理 总结一下我们之前使用中断的方式来进行数据的发送和接收 如果收到数据数据在RDR寄存器中 RXNE标志位就从0到1触发中断 进入中断服务函数 把数据缓存在队列中 然后在到进程函数中断接收数据函数中进行出队处理 发送数据就是把中断关闭&#xff08;标志位TXE…

《Junit单元测试》

目录 SpringBoot2.2.0版本之前的单元测试模式 SpringBoot2.2.0版本之后的单元测试模式 SpringBoot2.4以上版本移除了默认对Vintage的依赖 SpringBoot2.2.0版本之前的单元测试模式 SpringBooot 2.2.0 版本开始引入Junit5作为单元测试默认库&#xff0c;之前的版本是使用Junit…

线程...

文章目录 1.Linux中线程该如何理解2.重新定义线程 和 进程3.重谈地址空间 --- 第四讲4.Linux线程周边的概念 线程:是进程内的一个执行分支。线程的执行粒度,要比进程要细 很多教材喜欢这么说&#xff0c;这只是一个线程的特征之一&#xff0c;来解释线程。 1.Linux中线程该如何…

力扣 --- 最后一个单词的长度

题目描述&#xff1a; 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1&#xff1a; 输入&#xff1a;s "Hello World&…

GEE:Sobel算子卷积和Roberts算子卷积对比

作者:CSDN @ _养乐多_ 本文介绍了Sobel算子卷积和Roberts算子卷积操作的代码,并进行了图像对比,可以观察到两个算子的细微差异。 文章目录 一、Sobel算子和Roberts算子对比二、完整代码三、代码链接一、Sobel算子和Roberts算子对比 详细介绍介绍参考《遥感数字图像处理教程…

计算机导论——第39章 文件和目录

除了虚拟化CPU和内存&#xff0c;另外一个是持久存储&#xff0c;永久存储信息。持久存储设备与内存不同&#xff0c;内存在断电时内容会丢失&#xff0c;而持久存储设备会保持这些数据不变。 1. 文件和目录 文件就是一个线性字节数组&#xff0c;每个字节都可以读取或者写入…

DBS note7 (end):DB Design

目录 一、前言 二、引言 三、Entity-Relationship Models&#xff08;实体-关系模型&#xff09; 1、关系约束 三、函数依赖和正则化 1、BCNF分解 2、无损分解 3、依赖关系保留分解 一、前言 略读过一遍CS186&#xff0c;对于CS186来说&#xff0c;绝对不止这 7 篇笔记…

windows 你的电脑不能投影到其他屏幕,请尝试重新安装驱动程序

注意 千万不要去下载什么驱动精灵&#xff0c;太垃圾不好用还一堆附带的软件。按以下步骤进行解决&#xff1a; 解决方法 可能是显卡驱动的问题&#xff0c;我的笔记本按照如下步骤重启一下驱动后解决了&#xff0c;步骤如下: 右键点击桌面的开始菜单&#xff0c;选择”设备…

算法通关村第十六关-白银挑战滑动窗口经典题目

大家好我是苏麟 , 今天带来滑动窗口经典的一些题目 . 我们继续来研究一些热门的、高频的滑动窗口问题 大纲 最长子串专题无重复字符的最长子串 长度最小的子数组盛最多水的容器 最长子串专题 无重复字符的最长子串 描述 : 给定一个字符串 s &#xff0c;请你找出其中不含有重…

React如何像Vue一样将css和js写在同一文件

如果想在React中想要像Vue一样把css和js写到一个文件中&#xff0c;可以使用CSS-in-JS。 使用CSS-in-JS 下载 npm i styled-components使用 就像写scss一样&#xff0c;不过需要声明元素的类型 基本语法及展示如下&#xff0c; import styled from "styled-component…

React使报错不再白屏

如果代码中出现问题导致报错&#xff0c;通常会使页面报错&#xff0c;导致白屏 function Head() {// 此时模拟报错导致的白屏return <div>Head --- {content}</div> } export default () > {return (<><div>下面是标题</div><Head />…

Swing程序设计(7)JPane面板,滑动面板

文章目录 前言一、JPane面板&#xff0c;滑动面板是什么&#xff1f;二、实操展示 1.JPane面板2.JScrollPane面板总结 前言 该篇博客介绍Java的Swing程序中JPane面板以及&#xff0c;滑动面板的使用。面板的使用&#xff0c;各个组件在不同的面板上被不同地摆放&#xff0c;让插…

MATLAB Simulink +STM32硬件在环 (HIL)实现例程测试

MATLAB Simulink STM32硬件在环 &#xff08;HIL&#xff09;实现例程测试 &#x1f4cd;相关篇《STM32CubeMxMATLAB Simulink点灯程序》✨本例程没有使用到STM32CubeMX来创建工程&#xff08;在Simulink 中不是选择的STM32xxxbased类型的&#xff09;。 &#x1f516;STM32xxx…

Github无法打开

文章目录 一、问题二、解决2.1、科学上网&#xff08;使用中&#xff09;2.2、使用代理&#xff08;不稳定&#xff09;2.3、修改hosts&#xff08;得更新&#xff09;2.3.1、找到hosts文件2.3.2、复制hosts文件2.3.3、添加记录2.3.4、替换原来的hosts文件2.3.5、成功访问Githu…

W2311294-万宾科技可燃气体监测仪怎么进行数据监测

万宾科技可燃气体监测仪怎么进行数据监测 燃气是现代城市之中重要的能源&#xff0c;它已经渗透到城市生活的方方面面&#xff0c;对燃气管网的管理也在考验着政府人员的工作能力。燃气管网的安全运行和城市的安全和人民的生活直接挂钩。为了及时掌握燃气管网的运行状态&#x…

2023年GopherChina大会-核心PPT资料下载

一、峰会简介 自 Go 语言诞生以来&#xff0c;中国便是其应用最早和最广的国家之一&#xff0c;根据 Jetbrains 在 2021 年初做的调查报告&#xff0c;总体来说目前大概有 110 万专业的开发者 选择 Go 作为其主要开发语言。就其全球分布而言, 居住在亚洲的开发者最多&#xff…

了解大模型 RAG (Retrieval-Augmented Generation):大模型外挂知识库 (检索增强技术)

本心、输入输出、结果 文章目录 了解大模型 RAG &#xff08;Retrieval-Augmented Generation&#xff09;&#xff1a;大模型外挂知识库 &#xff08;检索增强技术&#xff09;前言什么是检索增强技术 RAG &#xff08;Retrieval-Augmented Generation&#xff09;检索增强技术…

RocketMQ领域模型详解

1、主题&#xff08;Topic&#xff09; 1.1、定义​ 主题是 Apache RocketMQ 中消息传输和存储的顶层容器&#xff0c;用于标识同一类业务逻辑的消息。 主题的作用主要如下&#xff1a; 定义数据的分类隔离&#xff1a; 在 Apache RocketMQ 的方案设计中&#xff0c;建议将不同…

【STM32】STM32学习笔记-STM32简介(02)

00. 目录 文章目录 00. 目录01. STM32简介1.1 STM32是什么1.2 STM32应用领域1.3 STM32命名规则1.4 STM32选型 02. ARM简介2.1 ARM是什么2.2 ARM系列 03. STM32开发板3.1 MCU简介3.2 STM32开发板3.3 STM32硬件资源 04. STM32系统架构05. STM32引脚定义06. STM32启动配置07. STM3…