数据结构实验任务六 :基于 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.mzph.cn/news/195673.shtml

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

相关文章

Vision Transformer

Vision Transformer详解-CSDN博客 视频&#xff1a;11.1 Vision Transformer(vit)网络详解_哔哩哔哩_bilibili Vision Transformer学习笔记_linear projection of flattened patches-CSDN博客 一、embedding 层 对于标准的Transformer模块&#xff0c;要求输入的是token (向量…

win10使用copilot(尝试中)

一、 Microsoft account | Sign In or Create Your Account Today – Microsoft 一路next全部点好【1】 二、 查看当前win10的版本&#xff0c;cmd输入命令winver 三、 修改区域为美国 四、更新和安全 Reference 【1】完美&#xff5c;在 Win10 强行开启 Win11 的独有功能…

蓝桥杯每日一题2023.12.4

题目描述 竞赛中心 - 蓝桥云课 (lanqiao.cn) 题目分析 本题使用树型DP&#xff0c;蓝桥杯官网出现了一个点的错误&#xff0c;但实际答案是正确的 状态表示&#xff1a;f[u]&#xff1a;在以u为根的子树中包含u的所有联通块的权值的最大值 假设s1&#xff0c;s2,…sk 是u的…

腾讯云双十二优惠活动有哪些?详细攻略来了!

腾讯云作为全球领先的云计算服务提供商&#xff0c;一直在为各行各业的用户提供优质、高效、稳定的云计算服务。双十二即将来临&#xff0c;腾讯云也为大家准备了一系列丰富多彩的优惠活动。那么&#xff0c;这些优惠活动究竟有哪些&#xff1f;详细攻略在此&#xff0c;一起来…

jsp高校教师调课管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 高校教师调课管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysq…

洗浴按摩店服务预约管理系统会员小程序效果如何

洗浴按摩是线下服务需求度较高的行业&#xff0c;如今互联网趋势下&#xff0c;传统线下实体店面临多重经营痛点&#xff0c;需要商家转而线上管理及赋能客户消费、完善订单流程&#xff0c;多平台宣传让目标客户触达。 接下来让我们看看通过【雨科】平台搭建洗浴按摩店管理系…

22款奔驰GLE450升级香氛负离子 车载香薰功能

相信大家都知道&#xff0c;奔驰自从研发出香氛负离子系统后&#xff0c;一直都受广大奔驰车主的追捧&#xff0c;香氛负离子不仅可以散发出清香淡雅的香气外&#xff0c;还可以对车内的空气进行过滤&#xff0c;使车内的有害气味通过负离子进行过滤&#xff0c;达到车内保持清…

【C#】读取ini配置文件的内容

一、编写ini配置文件 ini文件时初始化文件&#xff0c;通常是系统配置文件所采用的存储格式。ini文件有自己的固定格式&#xff0c;是由若干个“节”&#xff08;section&#xff09;组成&#xff0c;每个节由若干个“键”&#xff08;key&#xff09;组成&#xff0c;每个key…

【cmake】获取到某个目录下的所有子目录名

整体工程目录结构如下。现打算获取到vac目录下的所有子目录名。 cmake 实现如下: # 设定要遍历的目录&#xff0c;保存到 VAC_INCLUDE_DIR 变量 set(VAC_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/vac)# 获取到当前目录下的所有文件和目录&#xff08;以相对路径的方式&#xff09;&a…

【源码篇】基于SpringBoot+thymeleaf实现的蓝天幼儿园管理系统

基于SpringBootthymeleaf实现的蓝天幼儿园管理系统 文章目录 系统说明技术选型成果展示账号地址及其他说明 系统说明 基于SpringBootthymeleaf实现的蓝天幼儿园管理系统是为幼儿园提供的一套管理平台&#xff0c;可以提高幼儿园信息管理的准确性&#xff0c;系统将信息准确无误…

idea保存时自动删除不用的import

1、File->setting 2、Editor->General->Auto Import 按照操作&#xff0c;即可实现&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;

讲解商品比价API使用说明

今日讲解商品比价API使用说明 商品数据分析 国内最早的比价搜索平台&#xff0c;专注于电商大数据的分析&#xff0c;有10年技术和数据沉淀。 公司自主研发的爬虫、搜索引擎、分布式计算等技术&#xff0c; 实现了对海量电商数据的及时监测、清洗和统计。 数据丰富 详细使…

基于社区电商的Redis缓存架构-用户分享内容的分页列表缓存延迟构建以及异步通知缓存重建

分页列表缓存的延迟构建 首先&#xff0c;先来讲一下业务场景&#xff0c;用户会在 APP 中去分享内容&#xff0c;那么假如用户分享的是美食菜谱内容&#xff0c;在用户分享之后&#xff0c;先将这个美食菜谱的内容作为 k-v 进行缓存&#xff0c;但是呢&#xff0c;其实对于用…

交通强国添力量 无人机巡航为何备受期待?

在高速建设交通强国的过程中&#xff0c;交通运输部海事局计划完善“陆海空天”一体化水上交通运输安全保障体系。无人机巡航系统将在提升海事船舶监管和水上搜救能力方面发挥关键作用&#xff0c;以构建更为全面的监管体系。尽管已初步建立了海事监管体系&#xff0c;但仍存在…

可用的镜像 yum 源

目录 ftp.sjtu.edu.cn 镜像 yum 源centos 的镜像 yum 源 mirrors.sohu.comcentos 的镜像 yum 源 mirrors.163.comcentos 的镜像 yum 源 ftp.sjtu.edu.cn 镜像 yum 源 镜像 yum 源地址 &#xff1a; http://ftp.sjtu.edu.cn/centos/ centos 的镜像 yum 源 http://ftp.sjtu.edu…

解密Prompt系列20. LLM Agent之再谈RAG的召回多样性优化

几个月前我们就聊过RAG的经典方案解密Prompt系列14. LLM Agent之搜索应用设计。前几天刚看完openAI在DevDay闭门会议上介绍的RAG相关的经验&#xff0c;有些新的感悟&#xff0c;借此机会再梳理下RAG相关的优化方案。推荐直接看原视频&#xff08;外网&#xff09;A Survey of …

github问题解决(持续更新中)

1、ssh: connect to host github.com port 22: Connection refused 从.ssh文件夹中新建文件名为config&#xff0c;内容为&#xff1a; Host github.com Hostname ssh.github.com Port 4432、解决 git 多用户提交切换问题 使用系统命令ssh创建rsa公私秘钥 C:\Users\fyp01&g…

zabbix配置snmp trap--使用snmptrapd和Bash接收器(缺zabbix_trap_handler.sh文中自取)--图文教程

1.前言 我的zabbix的版本是5.0版本&#xff0c;5.0的官方文档没有使用bash接收器的示例&#xff0c;6.0的官方文档有使用bash接收器的示例&#xff0c;但是&#xff0c;下载文件的链接失效&#xff1f;&#xff01; 这里讲解zabbix-server端配置和zabbix web端配置 2.zabbix-…

[oeasy]python0002_终端_CLI_GUI_编程环境_游戏_真实_元宇宙

回忆 上次 了解了 python 语言的特点 历史悠久功能强大深受好评已成趋势 3大主流操作系统 macwindowslinux 我们 选择 linux 作为基础系统 为什么选择 黑乎乎的命令行界面呢&#xff1f;&#x1f914; GUI vs CLI 个人电脑 用图标和菜单组成 图形界面(GUI) Graphic User I…

三十五、Seata的基本架构、部署TC服务、微服务集成Seata

目录 一、基本架构 1、Seata事务中的三个重要角色 2、四种不同的分布式事务解决方案&#xff1a; 二、TC的部署 三、微服务集成Seata 1、引入Seata相关依赖 2、配置yml文件 3、启动服务 一、基本架构 Seata是 2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决…