数据结构最短路径例题_数据结构算法实验8图的最短路径问题附源代码.doc

浙江大学城市学院实验报告

课程名称 数据结构与算法

实验项目名称 实验八 图的最短路径问题

实验成绩 指导老师(签名 ) 日期

实验目的和要求

掌握图的最短路径概念。

理解并能实现求最短路径的DijKstra算法(用邻接矩阵表示图)。

二. 实验内容

1、编写用邻接矩阵表示有向带权图时图的基本操作的实现函数,基本操作包括:

① 初始化邻接矩阵表示的有向带权图 void InitMatrix(adjmatrix G);

② 建立邻接矩阵表示的有向带权图 void CreateMatrix(adjmatrix G, int n) (即通过输入图的每条边建立图的邻接矩阵);

③ 输出邻接矩阵表示的有向带权图void PrintMatrix(adjmatrix G, int n) (即输出图的每条边)。

把邻接矩阵的结构定义以及这些基本操作函数存放在头文件Graph2.h中。

2、编写求最短路径的DijKstra算法函数 void Dijkstra( adjmatrix GA, int dist[], edgenode *path[], int i, int n) ,该算法求从顶点i到其余顶点的最短路径与最短路径长度,并分别存于数组 path 和 dist 中。编写打印输出从源点到每个顶点的最短路径及长度的函数void PrintPath(int dist[], edgenode *path[], int n)。

3、编写测试程序(即主函数),首先建立并输出有向带权图,然后计算并输出从某顶点v0到其余各顶点的最短路径。

要求:把指针数组的基类型结构定义edgenode、求最短路径的DijKstra算法函数、打印输出最短路径及长度的函数PrintPath以及主函数存放在文件test9_2.cpp中。

测试数据如下:

0

0

1

2

3

5

4

4

8

2

3

10

7

6

5

9

6

15

4、填写实验报告,实验报告文件取名为report8.doc。

5、上传实验报告文件report8.doc与源程序文件test9_2.cpp及Graph2.h到Ftp服务器上自己的文件夹下。

三. 函数的功能说明及算法思路

包括每个函数的功能说明,及一些重要函数的算法实现思路

【结构说明】

const int MaxVertexNum=10; //图的最大顶点数

const int MaxEdgeNum=100; //边数的最大值

const int MaxValue=32767; //权值的无穷大表示

typedef int adjmatrix[MaxVertexNum][MaxVertexNum]; //邻接矩阵

typedef struct Node {

int adjvex;

struct Node *next;

} edgenode;//路径结点

【函数说明】

① void InitMatrix(adjmatrix &G)

功能:初始化邻接矩阵表示的有向带权图

思路:将邻接矩阵中的所有权值设置为无穷大(MaxValue)

② void CreateMatrix(adjmatrix &G, int n)

功能:建立邻接矩阵表示的有向带权图(即通过输入图的每条边建立图的邻接矩阵)

思路:按照输入的顶点信息和权值信息,更新邻接矩阵内对应的值

③ void PrintMatrix(adjmatrix G, int n)

功能:输出邻接矩阵表示的有向带权图 (即输出图的每条边)

思路:按照一定的格式输出邻接矩阵

④ void Dijkstra( adjmatrix GA, int dist[], edgenode *path[], int i, int n)

功能:求最短路径的DijKstra算法函数

思路:按照从源点到其余每一顶点的最短路径长度递增的次序依次求出从源点到每个顶点的最短路径及长度。设立一个集合S,用以保存已求得最短路径的终点,其初值为只有一个元素,即源点;一个数组 dist[n],其每个分量 dist[j] 保存从源点经过S集合中顶点最后到达顶点 j 的路径中最短路径的长度,其初值为从源点到每个终点的弧的权值(没弧则置为∞);一个指针数组path[n],path[j]指向一个单链表,保存相应于dist[j]的从源点到顶点 j 的最短路径(即顶点序列),初值为空。

⑤ void PATH(edgenode *path[], in

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值