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

上传人:b****6 文档编号:7359455 上传时间:2023-01-23 格式:DOCX 页数:13 大小:170.10KB
下载 相关 举报
数据结构算法实验8图的最短路径问题.docx_第1页
第1页 / 共13页
数据结构算法实验8图的最短路径问题.docx_第2页
第2页 / 共13页
数据结构算法实验8图的最短路径问题.docx_第3页
第3页 / 共13页
数据结构算法实验8图的最短路径问题.docx_第4页
第4页 / 共13页
数据结构算法实验8图的最短路径问题.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

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

《数据结构算法实验8图的最短路径问题.docx》由会员分享,可在线阅读,更多相关《数据结构算法实验8图的最短路径问题.docx(13页珍藏版)》请在冰豆网上搜索。

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

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

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

课程名称数据结构与算法

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

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

一.实验目的和要求

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

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

二.实验内容

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

①初始化邻接矩阵表示的有向带权图voidInitMatrix(adjmatrixG);

②建立邻接矩阵表示的有向带权图voidCreateMatrix(adjmatrixG,intn)(即通过输入图的每条边建立图的邻接矩阵);

③输出邻接矩阵表示的有向带权图voidPrintMatrix(adjmatrixG,intn)(即输出图的每条边)。

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

2、编写求最短路径的DijKstra算法函数voidDijkstra(adjmatrixGA,intdist[],edgenode*path[],inti,intn),该算法求从顶点i到其余顶点的最短路径与最短路径长度,并分别存于数组path和dist中。

编写打印输出从源点到每个顶点的最短路径及长度的函数voidPrintPath(intdist[],edgenode*path[],intn)。

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

要求:

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

测试数据如下:

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

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

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

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

【结构说明】

constintMaxVertexNum=10;实验结果与分析

包括运行结果截图等

【测试数据】

顶点数:

7

输入弧的信息:

尾顶点

头顶点

权值

0

1

8

0

3

5

1

2

2

1

4

10

2

4

6

2

5

5

3

1

3

3

5

7

3

6

15

6

5

9

正确的邻接矩阵应为:

8

4

2

10

6

5

3

7

15

9

下面以测试数据为基准,给出DijKstra算法生成最短路径的状态变化图:

(※注:

顶点旁边的代表当前状态下从源点到该顶点的最短路径长度)

【状态①】【状态②】

 

【状态③】【状态④】

 

【状态⑤】【状态⑥】

 

【状态⑦(最短路径)】

 

五.心得体会

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

 

【附录----源程序】

[]

#include<>

#include<>

#include<>

#include<>

#include""

typedefstructNode{

intadjvex;

structNode*next;

}edgenode;

voidmain(){

intn;

adjmatrixG;

edgenode*path[MaxVertexNum];

intdist[MaxVertexNum];

voidDijkstra(adjmatrixGA,intdist[],edgenode*path[],inti,intn);

voidPrintPath(intdist[],edgenode*path[],intn);

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算法函数

voidDijkstra(adjmatrixGA,intdist[],edgenode*path[],inti,intn){

intj,k;

intv=1,minIndex;

voidPATH(edgenode*path[],inti,intj);

bool*isStepped;

//初始化部分

//isStepped:

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

//dist:

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

//path:

邻接矩阵中i顶点到各顶点若有路径,则保存;无路径置为NULL

isStepped=newbool[n];

for(j=0;j

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

if(dist[j]!

=MaxValue&&j!

=i){

path[j]=newedgenode;

path[j]->adjvex=i;

path[j]->next=newedgenode;

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

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

}

elsepath[j]=NULL;

isStepped[j]=false;

}

isStepped[i]=true;

while(v<=n){

//尝试查找当前最小路径结点,用minIndex保存顶点

minIndex=i;

for(k=0;k

if(dist[k]

isStepped[k]))

minIndex=k;

}

//有查找到最小路径顶点,则将其并入集合

if(minIndex!

=i)

isStepped[minIndex]=true;

//未查找到,则说明路径都为∞,退出

else

break;

//通过while中确定的最小路径顶点(minIndex)到达当前顶点

//若路径长度小于dist中保存的路径长度,则修改

for(k=0;k

if(GA[minIndex][k]+dist[minIndex]

dist[k]=GA[minIndex][k]+dist[minIndex];

PATH(path,k,minIndex);

}

}

v++;

}

}

//将path[i]的路径改为path[j]的路径+i

voidPATH(edgenode*path[],inti,intj){

edgenode*p,*q,*t;

//删除path[i]中原来保存的链表

while(path[i]!

=NULL){

p=path[i]->next;

deletepath[i];

path[i]=p;

}

//将path[j]的路径复制给path[i]

p=newedgenode;

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

path[i]=p;

t=path[j]->next;

while(t!

=NULL){

q=p;

p=newedgenode;

p->adjvex=t->adjvex;

q->next=p;

t=t->next;

}

//将j结点加入path[i]的路径中

q=p;

p=newedgenode;

p->adjvex=i;

p->next=NULL;

q->next=p;

}

//打印输出从源点到每个顶点的最短路径及长度的函数

voidPrintPath(intdist[],edgenode*path[],intn){

inti;

edgenode*p;

for(i=1;i

cout<<"[v0->v"<

cout<<"最短路径:

";

p=path[i];

if(p==NULL){

cout<<"无路径!

"<

continue;

}

while(p!

=NULL){

cout<<"v"<adjvex<<"";

p=p->next;

}

cout<

"<

}

}

[]

constintMaxVertexNum=10;//图的最大顶点数

constintMaxEdgeNum=100;//边数的最大值

constintMaxValue=32767;//权值的无穷大表示

typedefintadjmatrix[MaxVertexNum][MaxVertexNum];//邻接矩阵

//①初始化邻接矩阵表示的有向带权图

voidInitMatrix(adjmatrix&G)

{

inti,j;

for(i=0;i

for(j=0;j

G[i][j]=MaxValue;

}

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

voidCreateMatrix(adjmatrix&G,intn)

{

intv,w,q;

printf("按照:

尾顶点名->头顶点名,权值输入数据,以0->0,0结尾:

如A->B,23\n");

while(true){//构造邻接矩阵

scanf("%d->%d,%d",&v,&w,&q);//输入弧的两个定点及该弧的权重

getchar();

if(v==0&&w==0)break;

if(v<0||v>=n||w<0||w>=n){cerr<<"vertexERROR!

";exit

(1);}

G[v][w]=q;

}

}

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

voidPrintMatrix(adjmatrixG,intn)

{

inti,j;

cout<

cout<<"YourGraphis:

"<

for(i=0;i

for(j=0;j

if(G[i][j]!

=MaxValue)printf("%2d|",G[i][j]);

elseprintf("∞|");

}

printf("\n");

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 哲学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1