数据结构算法实验8图的最短路径问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

课程名称数据结构与算法

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

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

一.实验目的和要求

1.掌握图的最短路径概念。

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

二. 实验内容

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

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

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

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

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

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以及主函数存放在文件中。

测试数据如下:

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

5、上传实验报告文件与源程序文件及到Ftp服务器上自己的文件夹下。

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

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

【结构说明】

const int MaxVertexNum=10; 实验结果与分析

包括运行结果截图等

【测试数据】

顶点数:7

输入弧的信息:

035

122

1410

246

255

313

357

3615

659

正确的邻接矩阵应为:

∞8∞4∞∞∞

∞∞2∞10∞∞

∞∞∞∞65∞

∞3∞∞∞715

∞∞∞∞∞∞∞

∞∞∞∞9∞∞

∞∞∞∞∞∞∞

下面以测试数据为基准,给出DijKstra 算法生成最短路径的状态变化图: (※注:顶点旁边的代表当前状态下从源点到该顶点的最短路径长度)

【状态①】 【状态②】

【状态③】 【状态④】

【状态⑤】 【状态⑥】

【状态⑦(最短路径)】

<11>

五. 心得体会

记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。

【附录----源程序】

[]

#include<>

#include<>

#include<>

#include<>

#include""

typedef struct Node {

int adjvex;

struct Node *next;

} edgenode;

void main(){

int n;

adjmatrix G;

edgenode *path[MaxVertexNum];

int dist[MaxVertexNum];

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

void PrintPath(int dist[], edgenode *path[], int n);

InitMatrix(G);

printf("输入要构造的图顶点数\n");

scanf("%d",&n);

CreateMatrix(G,n);

PrintMatrix(G,n); //打印图的邻接矩阵

cout<

**************"<

Dijkstra(G, dist, path, 0, n);

PrintPath(dist,path,n);

}

//求最短路径的DijKstra算法函数

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

int j,k;

int v = 1,minIndex;

void PATH(edgenode *path[], int i, int j);

bool *isStepped;

//初始化部分

//isStepped:申请n个空间,除i以外均为false

//dist:邻接矩阵中i顶点到各顶点的距离

//path:邻接矩阵中i顶点到各顶点若有路径,则保存;无路径置为NULL isStepped = new bool[n];

for (j = 0; j < n; j++){

dist[j] = GA[i][j];

if (dist[j] != MaxValue && j!=i){

path[j] = new edgenode;

path[j]->adjvex = i;

path[j]->next = new edgenode;

path[j]->next->adjvex = j;

相关文档
最新文档