单源结点最短路径问题设计书.docx

上传人:b****2 文档编号:2035567 上传时间:2022-10-26 格式:DOCX 页数:13 大小:21.48KB
下载 相关 举报
单源结点最短路径问题设计书.docx_第1页
第1页 / 共13页
单源结点最短路径问题设计书.docx_第2页
第2页 / 共13页
单源结点最短路径问题设计书.docx_第3页
第3页 / 共13页
单源结点最短路径问题设计书.docx_第4页
第4页 / 共13页
单源结点最短路径问题设计书.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

单源结点最短路径问题设计书.docx

《单源结点最短路径问题设计书.docx》由会员分享,可在线阅读,更多相关《单源结点最短路径问题设计书.docx(13页珍藏版)》请在冰豆网上搜索。

单源结点最短路径问题设计书.docx

单源结点最短路径问题设计书

单源结点最短路径问题设计书

 

1设计容

单元结点最短路径问题。

问题描述:

求从有向图中的某一结点出发到其余各结点的最短路径。

基本要求:

(1)有向图采用邻接矩阵表示。

(2)单元结点最短路径问题采用狄克斯特拉算法。

(3)输出有向图中从源结点到其余各结点的最短路径和最短路径值。

测试数据:

如下图有向带权图所示

2算法思想描述

狄克斯特拉算法思想:

设置两个顶点的集合S和T,集合S中存放已找到最短路径的顶点,集合T中存放当前还未找到路径的顶点。

初始状态时,集合S中包含源点,设为v0,然后从集合T中选择v0路径长度最短的顶点u加入到集合S中,集合S中每加入一个新的顶点u,都要修改源点v0到集合T中剩余顶点的当前最短路径的当前最短路径长度值,集合T中各顶点的新的当前最短路径长度值为原来的当前最短路径长度值与从源点过顶点u到达该顶点的路径长度中的较小者。

此过程不断重复,直到集合T中的顶点全部加入到集合S中为止。

3算法及程序实现

#include

#include

typedefcharDataType;//定义顺序表的数据类型为char

#defineMaxSize10//定义顺序表数组的最大个数

#defineMaxVertices10//定义顶点的最大个数

#defineMaxWeight10000//定义权值的具体最大值

#include"AdjMGraph.h"//包含AdjMGraph.h头文件

#include"AdjMGraphCreate.h"//包含AdjMGraphCreate.h头文件

#include"Dijkstra.h"//包含Dijkstra.h函数的文件

voidmain(void)

{

AdjMGraphg;

chara[]={'A','B','C','D','E','F'};

RowColWeightrcw[]={{0,1,10},{0,2,12},{1,3,16},{1,4,25},{2,0,4},{2,1,3},{2,3,12},

{2,5,8},{3,4,7},{5,3,2},{5,4,10}};

inti,n=6,e=11;

intdistance[6],path[6];

CreatGraph(&g,a,n,rcw,e);

Dijkstra(g,0,distance,path);

printf("\n\t从顶点%c到其余各顶点的最短路径值分别为:

\n",g.Vertices.list[0]);

for(i=1;i

printf("\t%c到%c的最短路径值为:

%d\n",

g.Vertices.list[0],g.Vertices.list[i],distance[i]);

printf("\n\t从顶点%c到其余各顶点的最短路径的前一顶点为:

\n",g.Vertices.list[0]);

for(i=1;i

if(path[i]!

=-1)

printf("\t%c到%c的最短路径的前一顶点为%c\n",g.Vertices.list[0],

g.Vertices.list[i],g.Vertices.list[path[i]]);

}

4算法测试及结果

从程序的运行结果,再结合测试数据的有向带权图,可以得出,从顶点A到其余各顶点的最短路径及距离如下。

A到B:

最短路径为(A,B),其距离为10

A到C:

最短路径为(A,C),其距离为12

A到D:

最短路径为(A,C,F,D),其距离为22

A到E:

最短路径为(A,C,F,D,E),其距离为29

A到F:

最短路径为(A,C,F),其距离为20

5总结

课程设计对学生而言是其对所学课程容掌握情况的一次自我验证,从而有着极其重要的意义。

通过课程设计能提高学生对所学知识的综合应用能力,能全面检查并掌握所学容;《数据结构》从课程性质上讲是一门专业基础课,它的目的和任务就是训练学生对计算机加工的数据对象进行分析的能力,选择适当的数据结构及相应算法的能力,训练学生的编码以及调试能力,进而增加其对学习和应用相关专业课的兴趣。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,将结论用于实践,从而提高自己的实际动手能力和独立思考的能力。

在设计的过程中当然遇到了问题,可以说得是困难重重,毕竟这是不可避免的,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。

由于编程水平有限,其中头文件和狄杰斯特拉算法的函数设计等是参考书上资料,我想在以后的学习中,要更注重实践这一环节。

在设计的过程中遇到种种问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。

从设计过程看,在整整半个月的日子里,做到精益求精,学到了很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

从设计结果看,设计要求完成任务,达到了预期的目的,设计、演示效果较好。

最主要是从中学到了知识。

参考资料

[1]朱战立.数据结构-使用C语言[M].:

电子工业,2009.

[2]CliffordAshaffer.数据结构与算法分析[M].:

电子工业,2006

[3]SartajSahni.数据结构、算法与应用[M].小,译.:

机械工业,2006.

[4]梁田贵,鹏.算法设计与分析[M]:

冶金工业,2004.

[5]广树健.C语言程序设计[M].:

华南理工大学,2008.

[6]胡学刚.算法与数据结构算法设计指导[M].:

清华大学,2000

[7]许卓群,冬青,唐世渭,铭.数据结构与算法[M].:

高等教育,2004.

 

附件:

AdjMGraph.h头文件

#include"SeqList.h"//包含顺序表头文件

typedefstruct

{

SeqListVertices;//存放顶点的顺序表

intedge[MaxVertices][MaxVertices];//存放边的邻接矩阵

intnumOfEdges;//边的条数

}AdjMGraph;//图的结构体定义

voidInitiate(AdjMGraph*G,intn)//初始化

{

inti,j;

for(i=0;i

for(j=0;j

{

if(i==j)G->edge[i][j]=0;

elseG->edge[i][j]=MaxWeight;//MaxWeight表示无穷大

}

G->numOfEdges=0;//边的条数置为0

ListInitiate(&G->Vertices);//顺序表初始化

}

 

voidInsertVertex(AdjMGraph*G,DataTypevertex)//在图G中插入顶点vertex

{

ListInsert(&G->Vertices,G->Vertices.size,vertex);//顺序表尾插入

}

 

voidInsertEdge(AdjMGraph*G,intv1,intv2,intweight)

//在图G中插入边,边的权为weight

{

if(v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size)

{

printf("参数v1或v2越界出错!

\n");

return;

}

G->edge[v1][v2]=weight;

G->numOfEdges++;

}

voidDeleteEdge(AdjMGraph*G,intv1,intv2)

//在图G中删除边

{

if(v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size||v1==v2)

{

printf("参数v1或v2越界出错!

\n");

return;

}

if(G->edge[v1][v2]==MaxWeight||v1==v2)

{

printf("该边不存在!

\n");

return;

}

G->edge[v1][v2]=MaxWeight;

G->numOfEdges--;

}

intGetFirstVex(AdjMGraphG,intv)

//在图G中寻找序号为V的顶点的第一个邻接顶点

//如果这样的邻接顶点存在,则返回该邻接顶点的序号;否则返回-1

{

intcol;

if(v<0||v>G.Vertices.size)

{

printf("参数v1越界出错!

\n");

return-1;

}

for(col=0;col<=G.Vertices.size;col++)

if(G.edge[v][col]>0&&G.edge[v][col]

return-1;

}

intGetNextVex(AdjMGraphG,intv1,intv2)

//在图G中寻找v1顶点的邻接顶点v2的下一个邻接顶点

//如果这样的邻接顶点存在,则返回该邻接顶点的序号;否则返回-1

//v1和v2都是相应顶点的序号

{

intcol;

if(v1<0||v1>G.Vertices.size||v2<0||v2>G.Vertices.size)

{

printf("参数v1或v2越界出错!

\n");

return-1;

}

for(col=v2+1;col<=G.Vertices.size;col++)

if(G.edge[v1][col]>0&&G.edge[v1][col]

return-1;

}

 

AdjMGraphCreate.h头文件

typedefstruct

{

introw;//行下标

intcol;//列下标

intweight;//权值

}RowColWeight;//边信息结构体定义

voidCreatGraph(AdjMGraph*G,DataTypeV[],intn,RowColWeightE[],inte)

//在图G中插入n个顶点信息V和e条边信息E

{

inti,k;

Initiate(G,n);//顶点顺序表初始化

for(i=0;i

InsertVertex(G,V[i]);//插入顶点

for(k=0;k

InsertEdge(G,E[k].row,E[k].col,E[k].weight);//插入边

}

 

Dijkstra.h头文件

voidDijkstra(AdjMGraphG,intv1,intdistance[],intpath[])

//带权图G从下标v0顶点到其他顶点的最短距离distance和最短路径下标path

{

intn=G.Vertices.size;

int*s=(int*)malloc(sizeof(in

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

当前位置:首页 > PPT模板

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

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