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


实验目的
  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的路径为0final[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;
}
实验结果

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

  1. 题目 1708: 数据结构-Dijskra(迪杰斯特拉)最短路径算法

    参考<大话数据结构> 题目描述 在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题. 在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用 ...

  2. 数据结构——图——迪杰斯特拉(Dijkstra )算法

    数据结构--图--迪杰斯特拉(Dijkstra )算法 这是一个按路径长度递增的次序产生最短路径的算法.它的思路大体是这样的. 比如说要求图7-7-3中顶点v0到顶点v1的最短距离,没有比这更简单的了 ...

  3. 1768 Problem A 算法7-15:迪杰斯特拉最短路径算法

    问题 A: 算法7-15:迪杰斯特拉最短路径算法 时间限制: 1 Sec  内存限制: 32 MB 提交: 118  解决: 56 题目描述 在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点 ...

  4. 算法与数据结构(六) 迪杰斯特拉算法的最短路径(Swift版)

    上篇博客我们详细的介绍了两种经典的最小生成树的算法,本篇博客我们就来详细的讲一下最短路径的经典算法----迪杰斯特拉算法.首先我们先聊一下什么是最短路径,这个还是比较好理解的.比如我要从北京到济南,而 ...

  5. Codeup墓地-问题 A: 算法7-15:迪杰斯特拉最短路径算法

    题目描述 在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题. 在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用的一种,是一种按照路径长度递增的次 ...

  6. 问题 A: 算法7-15:迪杰斯特拉最短路径算法

    题目描述 在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题. 在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用的一种,是一种按照路径长度递增的次 ...

  7. 数据结构——图-迪杰斯特拉算法

    问题描述 将图以邻接矩阵或邻接表存储,实现Dijkstra算法. 算法设计 迪杰斯特拉算法: 1.假设用带权的邻接矩阵arc,来表示带权有向图,arc[i][j],表示弧<vi,vj>上的 ...

  8. 迪杰斯特拉c++_常用十大算法之 其九·迪杰斯特拉算法【日后详细补充】

    介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个结点到其他结点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 问题-最短路径 ...

  9. 迪杰斯特拉-最短路径算法

            迪杰斯特拉(Dijkstra)算法是基于动态规划实现的,他的主要功能是求出各节点到顶点的最短路径.         上图展示: 这是各节点连接图,其中A为顶点,求各节点到顶点的最短路径 ...

最新文章

  1. ASP.NET MVC3中的ViewBag动态性
  2. elupload获取文件名与路径_Uipath获取文件名,路径,扩展名等操作
  3. NLP自然语言处理必修清单(修炼法则)
  4. pip在多个python版本中将包安装到制定版本
  5. LINUX下载编译libfaac
  6. 看阮一峰ES6 笔记
  7. KnockOutJS(一)
  8. 监控freeswitch sip信令
  9. BIDS 怪异现象(转载)
  10. python (与C的差别)
  11. python推箱子代码详细讲解_Python使用tkinter模块实现推箱子游戏
  12. libevent库bufferevent事件实现socket通信
  13. 做头条自媒体运营的4点技巧
  14. python 升级setuptools_PIP无法升级setuptools
  15. php configure libzip,PHP安装zip拓展,以及libzip安装问题
  16. 架构师成长之路(5)--如何获取知识(方法)
  17. 计算机视觉——顶会、顶刊
  18. 奇虎360支持Unity引擎 将推3D页游无插件安装
  19. android_9ce1什么手机,HTC E1评测:客制化路线下的Android手机
  20. i2c子系统-----mpu6050

热门文章

  1. 使用IDEA导出war包详细步骤
  2. ProjectDay03
  3. 0Cr17Ni4Cu4Nb(17-4PH)钢锻造工艺
  4. 程序媛是怎样找老公的
  5. 字节序、大端字节序(Big Endian)、小端字节序(Little Endian)总结
  6. Android是什么牌子,美国最受欢迎的Android手机是哪个品牌?
  7. 同一个文件夹excel合并,以及同一个文件夹下特定sheet合并代码
  8. python静态变量和动态变量_动态变量和静态变量的区别,堆和栈的区别
  9. latex 中特殊符号:字母中央有斜杠
  10. 云服务器下能安装虚拟机吗,云服务器下能安装虚拟机吗