大二数据结构实验(迪杰斯特拉最短路径)

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

大二数据结构实验,有详细批注,代码可以直接运行,希望可以给大家提供到帮助。


实验目的
  1. 掌握图的邻接矩阵的存储定义。
  2. 掌握图的最短路径(Dijsktra)算法的实现。
实验内容

设计校园平面图,所含景点不少于8个。以图中顶点表示学校内各景点,存放景点的名称、景点介绍信息等;以边表示路径,存放路径长度信息。要求将这些信息保存在文件graph.txt中,系统执行时所处理的数据要对此文件分别进行读写操作。

  1. 从文件graph.txt中读取相应数据, 创建一个图,使用邻接矩阵表示图(算法6.1)。
  2. 景点信息查询:为来访客人提供校园任意景点相关信息的介绍。
  3. 问路查询:为来访客人提供校园任意两个景点之间的一条最短路径(算法6.10)。

graph.txt:
大二数据结构实验(迪杰斯特拉最短路径),数据结构,算法,图论

程序核心代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2


#define MAXVEX 8   //最大顶点数
#define INFINITY 65535   //用65535来代表∞
typedef int Patharc[MAXVEX];  //用于存储最短路径下标
typedef int ShortPathTable[MAXVEX];   //同于存储到各点最短路径权值
typedef int EdgeType;   //边上的权值类型
int o;
typedef struct
{
	int n;
	char name[100];
	char info[10000];
}VertexType;          //顶点类型
typedef struct
{
	VertexType vexs[MAXVEX];    //顶点表
	EdgeType arc[MAXVEX][MAXVEX];   //邻接矩阵
	int numVertexes, numEdges;
}MGraph;

//邻接矩阵(无向图)
void CreateMGraph(MGraph* G)
{
	int i, j, k, w;
	FILE* fp;
	//printf("输入定点数和边数:\n");
	fp = fopen("C://Users//86133//Desktop//graph.txt", "r");
	if (fp == NULL)
	{
		printf("无法发现文件");
		exit(0);
	}
	fscanf(fp, "%d\n", &G->numVertexes);
	fscanf(fp, "%d\n", &G->numEdges);
	for (i = 0; i < G->numVertexes; i++)   //读入顶点信息
	{
		fscanf(fp, "%s\n", G->vexs[i].name);
		fscanf(fp, "%s\n", G->vexs[i].info);
		G->vexs[i].n = i;
	}
	for (i = 0; i < G->numVertexes; i++)   //读入顶点信息
	{
		printf("%s   %s\n", G->vexs[i].info, G->vexs[i].name);
	}

	for (i = 0; i < G->numVertexes; i++)   //初始化
	{
		for (j = 0; j < G->numVertexes; j++)
		{
			G->arc[i][j] = INFINITY;
		}
	}
	for (k = 0; k < G->numEdges; k++)
	{
		//printf("输入边(vi,vj)上的下标i,下标j和权w:\n");
		fscanf(fp, "%d %d %d", &i, &j, &w);
		G->arc[i][j] = w;
		G->arc[j][i] = G->arc[i][j];   //因为是无向图,所以矩阵对称
	}
	for (i = 0; i < G->numVertexes; i++)   //初始化
	{
		for (j = 0; j < G->numVertexes; j++)
		{
			printf("%d   ", G->arc[i][j]);
		}
		printf("\n");
	}
	fclose(fp);
}


void ShortestPath(MGraph G, int V0, Patharc* P, ShortPathTable* D)
{
	int v, w, k, min;
	int s1, s2;
	int final[MAXVEX];		// final[w] = 1 表示已经求得顶点V0到Vw的最短路径

	// 初始化数据
	for (v = 0; v < G.numVertexes; v++)
	{
		final[v] = 0;				// 全部顶点初始化为未找到最短路径
		(*D)[v] = G.arc[V0][v];		// 将与V0点有连线的顶点加上权值
		(*P)[v] = 0;				// 初始化路径数组P为0
	}
	(*D)[V0] = 0;		// V0至V0的路径为0
	final[V0] = 1;		// V0至V0不需要求路径

	// 开始主循环,每次求得V0到某个V顶点的最短路径
	for (v = 1; v < G.numVertexes; v++)
	{
		min = INFINITY;
		for (w = 0; w < G.numVertexes; w++)
		{
			if (!final[w] && (*D)[w] < min)
			{
				k = w;
				min = (*D)[w];
			}
		}
		final[k] = 1;	// 将目前找到的最近的顶点置1

		// 修正当前最短路径及距离
		for (w = 0; w < G.numVertexes; w++)
		{
			// 如果经过v顶点的路径比现在这条路径的长度短的话,更新!
			if (!final[w] && (min + G.arc[k][w] < (*D)[w]))
			{
				(*D)[w] = min + G.arc[k][w];	// 修改当前路径长度
				(*P)[w] = k;					// 存放前驱顶点
			}
		}
	}
	printf("最短路径为:");
	printf("%d\n", (*D)[o]);
	printf("最短路程为:");
	s1 = o;
	while (s1 != V0)
	{
		printf("%s   ", G.vexs[s1].name);
		s1 = (*P)[s1];
	}
	printf("%s", G.vexs[V0].name);
	printf("\n");
}
int main()
{
	int v;
	int r;
	MGraph G;
	Patharc A;
	ShortPathTable B;
	printf("创建图完成\n");
	printf("景点以及它的信息为\n");
	CreateMGraph(&G);
	while (TRUE)
	{
		printf("从西和出发");
		while (TRUE)
		{
			v = 0;
			if (v > MAXVEX || v < 0)
			{
				printf("请重新输入\n");
				continue;
			}
			break;
		}
		printf("请输入终点");
		while (TRUE)
		{
			scanf("%d", &o);
			if (v > MAXVEX || v < 0)
			{
				printf("请重新输入\n");
				continue;
			}
			break;
		}
		ShortestPath(G, v, &A, &B);
		printf("如须结束则输入0,如继续则输入任意数字\n");
		scanf("%d", &r);
		if (r == 0)
			break;
	}
	return 0;
}
实验结果

大二数据结构实验(迪杰斯特拉最短路径),数据结构,算法,图论文章来源地址https://www.toymoban.com/news/detail-518790.html

到了这里,关于大二数据结构实验(迪杰斯特拉最短路径)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【数据结构】最小生成树(Prim算法,普里姆算法,普利姆)、最短路径(Dijkstra算法,迪杰斯特拉算法,单源最短路径)

    问题解答 (1)最小生成树(Minimal Spanning Tree)的定义 生成树的代价 :设 G ( V , E ) G(V,E) G ( V , E ) 是一个无向连通网图,生成树上 各边的权值之和 称为 生成树的代价 。 最小生成树 :在图 G G G 所有生成树中, 代价最小的生成树 为 最小生成树 。 (2)最小生成树(MST)的性

    2024年02月11日
    浏览(38)
  • 数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)

    目录 问题分类  无权图单源最短路径算法 思路 伪代码 时间复杂度 代码实现(C语言) 有权图单源最短路径算法 Dijkstra(迪杰斯特拉)算法 伪代码  时间复杂度  代码实现(C语言) 多源最短路径算法 两种方法 Floyd算法 代码实现(C语言) 最短路径问题的抽象 在网络中,求

    2024年02月08日
    浏览(57)
  • 【数据结构与算法】迪杰斯特拉算法

    介绍 迪杰斯特拉(Dijkstra)算法是 典型最短路径算法 ,用于计算一个节点到其他节点的最短路径。它的主要特点是以中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。 算法过程 设置出发顶点为 v,顶点集合 V{v1,v2,v3…vi},v 到 V 中各顶点的距离构成距离集合

    2024年02月11日
    浏览(48)
  • 数据结构--迪杰斯特拉(Dijkstra)算法

    生活封锁了我们,只要我们的心不死,生活便永远不是一汪死水,而我们,依然会绽放最美的姿态。 戴克斯特拉算法(英语:Dijkstra’s algorithm),又称迪杰斯特拉算法、Dijkstra算法,是由荷兰计算机科学家艾兹赫尔·戴克斯特拉在1956年发现的算法,并于3年后在期刊上发表。

    2024年02月04日
    浏览(49)
  • 大话数据结构-迪杰斯特拉算法(Dijkstra)和弗洛伊德算法(Floyd)

      最短路径,对于图来说,是两顶点之间经过的边数最少的路径;对于网来说,是指两顶点之间经过的边上权值之和最小的路径。路径上第一个顶点为源点,最后一个顶点是终点。   以如下无向图为例:   我们来计算下标为0的顶点,到其他顶点的最短路径,首先定义

    2024年02月06日
    浏览(39)
  • 【数据结构】最短路径算法实现(Dijkstra(迪克斯特拉),FloydWarshall(弗洛伊德) )

    最短路径问题 :从在带权有向图G中的某一顶点出发,找出一条通往另一顶点的最短路径,最短也就是沿路径各边的权值总和达到最小。 单源最短路径问题:给定一个图G = ( V , E ) G=(V,E)G=(V,E),求源结点s ∈ V s∈Vs∈V到图 中每个结点v ∈ V v∈Vv∈V的最短路径 针对一个带权

    2024年02月04日
    浏览(47)
  • 最短路径——迪杰斯特拉算法

    日常生活中常常涉及最短路径问题,如在一个城市交通网中,如何选取从起点到达终点的路径,才能使这一趟旅程的路程最短?或所需时间最少?或所需交通费用最低?诸如此类问题都可以抽象为 求解图的最短路径问题 。我们把 图的顶点 表示为 城市的交通站点 , 边表示交

    2024年02月04日
    浏览(48)
  • 最短路径:迪杰斯特拉算法

    简介         英文名Dijkstra         作用:找到路中指定起点到指定终点的带权最短路径 核心步骤         1)确定起点,终点         2)从未走过的点中选取从起点到权值最小点作为中心点         3)如果满足 起点到中心点权值 + 中心点到指定其他点的

    2024年02月08日
    浏览(38)
  • 迪杰斯特拉算法(求最短路径)

    迪杰斯特拉算法用于查找图中某个顶点到其它所有顶点的最短路径,该算法既适用于无向加权图,也适用于有向加权图。 注意,使用迪杰斯特拉算法查找最短路径时,必须保证图中所有边的权值为非负数,否则查找过程很容易出错。 迪杰斯特拉算法的实现思路 图 1 是一个无

    2024年02月02日
    浏览(39)
  • 迪杰斯特拉算法 – 图的单源最短路径

    迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。迪杰斯特拉算法采

    2024年02月05日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包