实验六 基于 Dijsktra 算法的最短路径求解

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

实验六 基于Dijsktra算法的最短路径求解
一、实验目的
1.掌握图的邻接矩阵表示法,掌握采用邻接矩阵表示法创建图的算法。
2.掌握求解最短路径的 Dijsktra 算法。

二、实验内容
一张地图包括 n 个城市,假设城市间有 m 条路径(有向图),每条路径的长度
已知。给定地图的一个起点城市和终点城市,利用 Dijsktra 算法求出起点到终
点之间的最短路径

三、实验实习设备及开发环境
Visual studio 2022
四.实验实习过程步骤(注意是主要关键步骤,不是所有步骤,适当文字+截图说明)
Function1:初始化图,将结构体里面的节点数和边数都输入,然后根据路径间的关系,对邻接矩阵进行填充,如果在两个节点间有路径,则在对应的邻接矩阵中修改权重(首先要将邻接矩阵初始化,就是将所有的全部变成无穷大)。因为题目中是有向图,所以不需要将对称的节点也修改,如果是无向图,就需要将对称的也修改。
实验六 基于 Dijsktra 算法的最短路径求解,数据结构实验,算法

Funtion2:Dijkstra算法。从起点开始,建立一个数组来存储节点是否访问,一个数据记录节点离各点的距离,还有一个来记录最短路径。首先,从起点开始,将起点下标加入到最短路径数组里面,到个点距离首先设置为0,变为已经访问。然后依次访问有路径的节点,选择路径最小的节点,然后对这个节点,进行看看,是否加了这个节点后,这个节点到其他节点的路径是否变短了,如果有那么就更新路径。然后一直重复,直到访问完所有的节点。
实验六 基于 Dijsktra 算法的最短路径求解,数据结构实验,算法
实验六 基于 Dijsktra 算法的最短路径求解,数据结构实验,算法

五.实验实习结果及分析

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

实验结果成功。
六.实验遇到的问题及解决办法,实验心得体会及对此实验的意见或建议(有就写,无可不写)。文章来源地址https://www.toymoban.com/news/detail-802298.html

#include <stdio.h>
#include <stdlib.h>
#define MAX 99999
#define MAXVEX 100
#define true 1
#define false 0

int Path[MAXVEX];
int S[MAXVEX];
int D[MAXVEX];

typedef char Vexstype;
typedef int Arctype;

typedef struct Graph
{
	Vexstype vex[MAXVEX];//顶点
	Arctype arc[MAXVEX][MAXVEX];//邻接矩阵
	int vexnum, arcnum;//顶点和边数
}Graph;

int locatenum(Graph* city, char citynum)
{
	int i;
	for (i = 0; i < city->vexnum; i++)
	{
		if (citynum == city->vex[i])
		{
			return i;
		}
	}
}
int  Init(Graph* city,char *start,char *end)
{
	int i;
	int j;
	int  weight;
	char city1, city2;
	printf("请输入城市个数和路径条数\n");
	scanf("%d %d", &city->vexnum,&city->arcnum);
	fflush(stdin);
	if (city->vexnum == 0 || city->arcnum == 0)
	{
		return 0;
	}
	printf("请输入城市名\n");
	fflush(stdin);
	for (i = 0; i < city->vexnum; i++)
	{
		scanf(" %c", &city->vex[i]);
	}
	
	for (i = 0; i < city->vexnum; i++)
	{
		for (j = 0; j < city->vexnum; j++)
		{
			city->arc[i][j] = MAX;
		}
		
	}
	fflush(stdin);
	printf("请输入路径\n");
	for (i = 0; i < city->arcnum; i++)
	{
		scanf(" %c %c %d", &city1, &city2, &weight);
		fflush(stdin);
		city->arc[locatenum(city, city1)][locatenum(city, city2)] = weight;
	}
	fflush(stdin);
	printf("请输入起点和终点\n");
	scanf(" %c %c", &(*start), &(*end));

	return 1;
}

void dijikstra(Graph* city, char start, char end)
{
	int start_num = locatenum(city, start);
	int i;
	int min = MAX;
	for (i = 0; i < city->vexnum; i++)
	{
		S[i] = false;
		D[i] = city->arc[start_num][i];
		if (D[i] < MAX)
		{
			Path[i] = start_num;
		}
		else
		{
			Path[i] = -1;
		}
	}
	S[start_num] = true;
	D[start_num] = 0;

	int other;
	int min_num=i;
	for (i = 1; i < city->vexnum; i++)
	{
		min = MAX;
		for (other = 0; other < city->vexnum; other++)
		{
			if (S[other] == false && D[other] < min)
			{
				min = D[other];
				min_num = other;
			}
		}
		S[min_num] = true;
		for (other = 0; other < city->vexnum; other++)
		{
			if (S[other] == false && (D[min_num] + city->arc[min_num][other] < D[other]))
			{
				D[other] = D[min_num] + city->arc[min_num][other];
				Path[other] = min_num;
			}
		}
	}

}

void printPath(Graph* city, int end_num)
{
	if (Path[end_num] != -1)
	{
		printPath(city, Path[end_num]);
	}
	printf("%c ", city->vex[end_num]);
}
void findend(Graph* city, char end)
{
	int end_num = locatenum(city, end);
	printf("最短长度为%d\n", D[end_num]);
	int i;
	fflush(stdin); 
	printf("最短路径为\n");
	printPath(city, end_num);
	printf("\n");
}
int main()
{
	Graph city;
	int vexnum, arcnum;
	char start, end;
	while (Init(&city,&start,&end))
	{
		dijikstra(&city, start, end);
		findend(&city, end);

	}


	return 0;
}

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

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

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

相关文章

  • 数据结构(12)Dijkstra算法JAVA版:图的最短路径问题

    目录 12.1.概述 12.1.1.无权图的最短路径  12.1.2.带权图的最短路径 1.单源最短路径 2.多源最短路径 12.2.代码实现 无权图的最短路径,即最少步数,使用BFS+贪心算法来求解最短路径,比较好实现,此处不做展开讨论。 有权图的最短路径,不考虑权重为负数的情况,因为权重为负

    2024年02月06日
    浏览(48)
  • java数据结构与算法刷题-----LeetCode1091. 二进制矩阵中的最短路径

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 双分裂蛇:是求二维表中从起点到终点的经典思路(也是求无权图的最短路径问题的经典解法)。创建两条分裂蛇,分别从起点和

    2024年04月26日
    浏览(52)
  • 数据结构——图的最短路径

    在图中,求两个不同顶点间的不同路径中,边的权值和最小的那条路径。这条路径就叫做 最短路径(Shortest Path) ,第一个顶点叫做 源点(Source) ,最后一个顶点叫做 终点(Destination) 。 单源最短路径问题: 从某固定源点出发,求其到所有其他顶点的最短路径。         包

    2024年02月03日
    浏览(51)
  • Java高阶数据结构 & 图的最短路径问题

    图的最短路径问题! 图的基础知识博客:传送门 最短路径问题: 从在带权图的某一顶点出发,找出一条通往另一顶点的最短路径, 最短也就是沿路径各边的权值总 和达到最小 。 一共会讲解三种算法 Dijkstra算法【单源最短路径】 Bellman-Ford算法【单源最短路径】 改进:SPF

    2024年02月04日
    浏览(52)
  • 【Java高阶数据结构】图的最短路径问题

    图的最短路径问题! 图的基础知识博客:传送门 最短路径问题: 从在带权图的某一顶点出发,找出一条通往另一顶点的最短路径, 最短也就是沿路径各边的权值总 和达到最小 。 一共会讲解三种算法 Dijkstra算法【单源最短路径】 Bellman-Ford算法【单源最短路径】 改进:SPF

    2024年02月08日
    浏览(37)
  • 算法:关于图的最短路径算法

    本篇总结的是图当中的最短路径算法 单源最短路径问题:给定一个图 G = ( V , E ) G=(V,E)G=(V,E) ,求源结点 s ∈ V s∈Vs∈V 到图中每个结点 v ∈ V v∈Vv∈V 的最短路径。 Dijkstra 算法就适用于解决带权重的有向图上的单源最短路径问题,同时算法要求图中所有边的权重非负。一

    2024年02月19日
    浏览(39)
  • matlab算法模型——图的最短路径和距离

    目录 一、前言 二、最短路径 1.sqarse创建稀疏矩阵 ​​2.有向图的最短路径         使用graphallshortestpaths函数 使用dijkstra.ma函数(直接引用) 3.无向图的最短路径 使用函数graphallshortestpaths(2021的版本不能用了) 使用shortestpath函数 三、未解决的问题 动态规划——求解某类问题

    2024年02月04日
    浏览(38)
  • 算法课程设计--A*算法解决特定条件下的最短路径问题

             LOL 峡谷地图最优路径规划        以下问题的计算,按照该地图的基本规则来进行在该地图中分布着各种形状不规则的障碍区域环境。整个地图模型,可以根据需求进行自行简化。 问题一:在任意起点与终点之间,规划一条最短路径。 问题二:当你拥有一个闪现

    2024年02月10日
    浏览(60)
  • DS图—图的最短路径(无框架)迪杰斯特拉算法

    目录 题目描述 AC代码 题目描述 给出一个图的邻接矩阵,输入顶点v,用迪杰斯特拉算法求顶点v到其它顶点的最短路径。 输入 第一行输入t,表示有t个测试实例 第二行输入顶点数n和n个顶点信息 第三行起,每行输入邻接矩阵的一行,以此类推输入n行 第i个结点与其它结点如果

    2023年04月08日
    浏览(40)
  • Dijkstra算法——单源最短路径(指定一个节点(源点)到其余各个顶点的最短路径)

    国庆期间,小明打算从1号城市出发,在五天假期中分别去往不同的城市(2,3,4,5,6)旅游,为减轻负担,他想要知道1号城市到各个城市之间的最短距离。 现在需要设计一种算法求得源点到任意一个城市之间的最短路径。该问题的求解也被称为“单源最短路径”。 在所有

    2024年02月03日
    浏览(54)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包