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

本次代码为实验六:基于 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){							//计算结果,Dijsktrachar 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.rhkb.cn/news/208553.html

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

相关文章

【数据结构实验】排序(一)冒泡排序改进算法 Bubble及其性能分析

文章目录 1. 引言2. 冒泡排序算法原理2.1 传统冒泡排序2.2 改进的冒泡排序 3. 实验内容3.1 实验题目&#xff08;一&#xff09;输入要求&#xff08;二&#xff09;输出要求 3.2 算法实现 4. 实验结果5. 实验结论 1. 引言 排序算法是计算机科学中一个重要而基础的研究领域&…

chatgpt prompt提示词

chatgpt的接口是一个标准的http请求&#xff0c;请求的url为 POST https://api.openai.com/v1/chat/completions 官方的接口文档地址为&#xff1a;https://platform.openai.com/docs/api-reference/chat/create Example request curl https://api.openai.com/v1/chat/comp…

【计算机网络笔记】802.11无线局域网

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

VUE语法-(readonly的用法)将数据设置成只读模式

1、功能概述 在Vue中定义一个变量&#xff0c;这个变量的值不允许被修改&#xff0c;核心是通过readonly设置成只读。 如果不会使用ref和reactive响应式数据参考如下博客&#xff1a; https://blog.csdn.net/tangshiyilang/article/details/134701103 2、具体实现 如下案例…

Fabric:创建应用通道

搭建自定义网络可以参考文章&#xff1a; https://blog.csdn.net/yeshang_lady/article/details/134113296 1 创建通道 网络搭建完成之后&#xff0c;就可以开始创建通道了。Fabric V2.5.4中可以在不创建系统通道的情况下直接创建应用通道。 1.1 修改配置文件 先创建配置文…

CSS浅谈动画性能

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目的一、举个栗子二、性能分析1.从图层分析2.性能分析 总结 目的 为了探究使用动画时&#xff0c;『transform』和『width、height、margin等』的差异 一、举个栗子…

大坝安全监测的内容及作用

大坝安全监测是指对大坝水雨情沉降、倾斜、渗压以及大坝形状特征有效地进行监测&#xff0c;及时发现潜在的安全隐患和异常情况&#xff0c;以便大坝管理人员能够做出科学决策&#xff0c;以确保大坝安全稳定运行。 大坝安全监测的主要内容 1.表面位移监测&#xff1a;监测大坝…

申请Azure学生订阅——人工验证

一&#xff1a;联系客服进行人工验证 点击 Services Hub 填写资料申请人工验证 点击 Azure - Sign up 进行学生验证 二&#xff1a;与客服的邮件沟通的记录 ​​​​一、结果&#xff08;输入客服给的验证码后&#xff0c;笔者便得到了学生订阅&#xff09;&#xff1a; 二…

汇编语言实现音乐播放器

目标程序 用汇编语言实现一个音乐播放器&#xff0c;并支持点歌 Overview 乐曲是按照一定的高低、长短和强弱关系组成的音调&#xff0c;在一首乐曲中&#xff0c;每个音符的音高和音长与频率和节拍有关&#xff0c;因此我们要分别为3首要演奏的乐曲定义一个频率表和一个节拍…

如何判断电脑电源质量的好坏?

电脑电源作为电脑的关键部件直接影响到电脑的性能和寿命&#xff0c;因此选择一个好的电源至关重要。那么要如何判断电脑电源的好坏呢?判断的指标都有哪些呢? 1.外观检测 观察电源外观可以初步判断电脑电源的工艺质量和材料质量。外观检测需要检查电源外壳是否坚固&#xff0…

性能自动化测试?

一、思考❓❔ 1.什么是性能自动化测试? 性能 系统负载能力超负荷运行下的稳定性系统瓶颈 自动化测试 使用程序代替手工提升测试效率性能自动化 使用代码模拟大批量用户让用户并发请求多页面多用户并发请求采集参数&#xff0c;统计系统负载能力生成报告 2.Python中的性能…

短线买入卖出有哪些交易技巧?

前面两节课&#xff0c;我们认识了短线交易&#xff0c;知道了短线交易常见的买入卖出时机&#xff0c;这节课&#xff0c;我们来讲解一下短线买入卖出的一些交易技巧。话不多时&#xff0c;直接进入重点&#xff01; 一、短线交易要果断 短线波动快&#xff0c;在出现买卖信号…

根文件系统构建-对busybox进行配置

一. 简介 本文来学习 根文件系统的制作中&#xff0c;关于 busybox的配置。 本文继上一篇 busybox中文支持的设置&#xff0c;地址如下&#xff1a; 根文件系统构建-busybox中文支持-CSDN博客 二. 根文件系统构建-busybox配置 1. 配置 busybox 与我们编译 Uboot 、 Lin…

Kubernetes技术与架构-策略

Kubernetes集群提供系统支持的策略&#xff0c;也提供开放接口给第三方定义的策略&#xff0c;这些策略用于可定义的配置文件或者Kubernetes集群的运行时环境&#xff0c;其中包括进程ID数量的申请与限制策略&#xff0c;服务器节点Node内的进程ID的数量限制策略&#xff0c;Po…

【U8+】用友U8删除固定资产卡片,提示:当前卡片不是本月录入的卡片,不能删除。

【问题描述】 用友U8软件&#xff0c;参照已有账套新建账套的时候&#xff0c;选择结转期初余额。 例如&#xff1a;参照已有账套的2022年新建2023年的账套。 结转期初的时候勾选了固定资产模块&#xff0c; 建立成功后登录23年新的账套后&#xff0c;删除固定资产卡片&#xf…

Kafka生产者发送消息的流程

Kafka 生产者发送消息的流程涉及多个步骤&#xff0c;从消息的创建到成功存储在 Kafka 集群中。以下是 Kafka 生产者发送消息的主要步骤&#xff1a; 1. 创建消息 生产者首先创建一个消息&#xff0c;消息通常包含一个键&#xff08;可选&#xff09;和一个值&#xff0c;以及…

2023年亚太杯数学建模A题解题思路(*基于OpenCV的复杂背景下苹果目标的识别定位方法研究)

摘要 由于要求较高的时效性和劳力投入&#xff0c;果实采摘环节成为苹果生产作业中十分重要的一部分。而对于自然环境下生长的苹果&#xff0c;光照影响、枝叶遮挡和果实重叠等情况普遍存在&#xff0c;这严重影响了果实的准确识别以及采摘点的精确定位。针对在复杂背景下苹果的…

C#,数值计算——插值和外推,三次样条插值(Spline_interp)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 三次样条插值 /// Cubic Spline Interpolation /// Cubic spline interpolation object. Construct with x and y vectors, and /// (optionally) values of the first…

jenkins使用nexus插件

nexus介绍 Nexus 是一个强大的仓库管理工具&#xff0c;用于管理和分发 Maven、npm、Docker 等软件包。它提供了一个集中的存储库&#xff0c;用于存储和管理软件包&#xff0c;并提供了版本控制、访问控制、构建和部署等功能。 Nexus 可以帮助开发团队提高软件包管理的效率和…

vue3中自定义hook函数

使用Vue3的组合API封装的可复用的功能函数 自定义hook的作用类似于vue2中的mixin技术 自定义Hook的优势: 很清楚复用功能代码的来源, 更清楚易懂 案例: 收集用户鼠标点击的页面坐标 hooks/useMousePosition.ts文件代码&#xff1a; import { ref, onMounted, onUnmounted …