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

这篇具有很好参考价值的文章主要介绍了数据结构实验任务六 :基于 Dijsktra 算法的最短路径求解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

以下附上实现代码:

#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;
} 

以上代码仅供参考,欢迎交流。文章来源地址https://www.toymoban.com/news/detail-763704.html

到了这里,关于数据结构实验任务六 :基于 Dijsktra 算法的最短路径求解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • BFU数据结构头歌实验:基于BF算法的病毒感染检测

    这道题当初我想着直接抄课本上的BF代码,结果发现书中的代码都是默认模式串和主串的下标从零开始,因此需要将书中的代码进行修改。如下图所示,需要将变量i,j的初值都设为0。然后将书中出现的i,j全部加1即可。然后这个函数中的第三个参数,pos的值我没有使用,这个

    2024年02月06日
    浏览(44)
  • 北京林业大学数据结构实验二 基于栈的算术表达式求值算法

    参见课本P75 例3.3

    2024年02月06日
    浏览(35)
  • 数据结构实验报告(四)——查找和排序算法

    1. 掌握顺序查找技术和拆半查找技术以及部分排序算法的设计思想; 2. 掌握查找、部分排序算法的实现与执行过程。 查找算法 1.顺序查找: 从数组第一个元素开始逐个比较,找到后返回相应下标。 2.折半查找: 从数组中间开始比较,如果需查找值比中间值大,则在中间值右

    2024年02月07日
    浏览(30)
  • 数据结构与算法之队列: Leetcode 621. 任务调度器 (Typescript版)

    任务调度器 https://leetcode.cn/problems/task-scheduler/ 描述 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或

    2024年02月02日
    浏览(29)
  • 《数据结构》实验报告四:串的模式匹配(BF算法、KMP算法)

    1、了解 串 的基本概念。 2、掌握 串的模式匹配算法 的实现 。 说明以下概念 1、模式匹配:          串的模式匹配就是 子串的定位运算 。          设有两个字符串 S 和 T ,S为 主串(正文串) ,T为 子串(模式串) 。在主串S中查找与模式串T相匹配的子串,若匹配成功,确定

    2024年02月01日
    浏览(43)
  • 数据结构第四次实验-常用的内部排序算法

    一、实验目的 1.掌握常见的内部排序算法的思想及其适用条件; 2.掌握常见的内部排序算法的程序实现; 二、实验内容及要求 1、任务描述 设计一个内部排序算法模拟系统,利用该系统实现常用的 7 种排序算法,并测试 各种排序算法的性能。 实验内容:通过一个简单的菜

    2024年02月07日
    浏览(34)
  • 合肥工业大学 宣城校区 数据结构与算法实验 队列、二叉树、查找和排序

    1.实验目标 熟练掌握队列的顺序存储结构和链式存储结构。 熟练掌握队列的有关算法设计,并在循环顺序队列和链队列上实现。 根据具体给定的需求,合理设计并实现相关结构和算法。 2.实验内容和要求 循环顺序队列的实验要求 循环顺序队列结构和运算定义,算法的实现以

    2024年02月11日
    浏览(35)
  • 基于Python的数据结构实验——循环顺序队列与递归(附详细代码和注释)

    1、创建名为 prac04_01.py 的文件,在其中编写一个循环顺序队列的类,该类必须包含 循环顺序队列的定义及基本操作,并通过以下步骤测试各种基本操作的实现是否正确。 (1)初始化一个循环顺序队列 CircularSequenceQueue。 (2)判断队列是否为空。 (3)遍历队列内的所有元素。 (4)将元

    2024年02月05日
    浏览(42)
  • 算法、数据结构、计算机系统、数据库MYSQL、概率论、数学实验MATLAB、数学建模、马原、英语、杂项、QT项目

    可以三个条件 以此类推 (condition1)?x:(condition2)?y:z string变成int int 变成string 可以用循环 模运算展开式推导 我们要证明等式: (a * b) mod m = ((a mod m) * (b mod m)) mod m 假设 a = q1 * m + r1 ,其中 q1 是 a 除以 m 的商, r1 是 a 除以 m 的余数。类似地,假设 b = q2 * m + r2 ,其中

    2024年02月08日
    浏览(47)
  • C语言---数据结构实验---哈夫曼树及哈夫曼编码的算法实现---图的基本操作

    本篇实验代码非本人写,代码源自外部,经调试解决了部分warning和error后在本地vs上可以正常运行,如有运行失败可换至vs 未来会重构实现该两个实验 内容要求: 1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立哈夫曼树 2、建立编码

    2024年02月13日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包