Dijkstra算法的实现数据结构与算法课程设计报告 i.docx
- 文档编号:8398745
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:12
- 大小:86.34KB
Dijkstra算法的实现数据结构与算法课程设计报告 i.docx
《Dijkstra算法的实现数据结构与算法课程设计报告 i.docx》由会员分享,可在线阅读,更多相关《Dijkstra算法的实现数据结构与算法课程设计报告 i.docx(12页珍藏版)》请在冰豆网上搜索。
Dijkstra算法的实现数据结构与算法课程设计报告i
合肥学院
计算机科学与技术系
课程设计报告
2009~2010学年第二学期
课程
数据结构与算法
课程设计名称
Dijkstra算法的实现
学生姓名
张来娣
学号
0804012002
专业班级
08计科
(2)
指导教师
王昆仑张贯红
2010年6月
题目:
Dijkstra算法的实现
一、问题分析和任务定义
1.1题目:
对任意图,选择合适的数据结构表示图,在此基础上实现求解最短路径的Dijkstra算法。
1.2要求:
对所设计的图的数据结构,提供必要的基本功能。
1.3具体任务:
建立图的表示模块,在建立图之后从单源点开始求最短路径,并显示出来。
2、实现功能:
2.1以领接矩阵为存储结构建立有向图
2.2在建立好的有向图中,显示出来从顶点到各个顶点的最短路径
3、测试用例:
3.1正确数据:
a)顶点:
3;边的条数:
2;顶点名称:
a,b,c;
边值信息:
ab2;c,b1;
b)顶点:
0;边的条数0;边值信息:
000;
3.2错误数据:
a)顶点:
#;
b)顶点:
3;边值信息:
01#;
3.3参考用图:
Xx系系
图1.有向图
问题分析:
题目要求选择合适的数据结构表示图,本程序邻接矩阵存储结点和弧等图的有关信息
对用邻接矩阵表示的有向图,从某一顶点出发(称为源点)到该图其他各顶点(称为终点)有无路径?
最短路径是什么?
路径长为多少?
问题要求写一个程序从有向网中的某一顶点出发找出该顶点到其余各顶点的最短路径。
对邻接矩阵arsc[n][n]中的每一个元素只能有三种情况:
①当i=j时,p[i][j]=0;
②当顶点i到j无边时,p[i][j]=MAX;
③当顶点i到j有边且权值为arcs[i][j]时,p[i][j]=arcs[i][j].
由于题目中没有规定输出格式,本程序以顶点序号的形式将最短路径输出到终端上去,并输出该最短路径的长度。
二、数据结构的选择和概要设计
1)数据存储结构
以邻接矩阵存储有向图,如图2中有向图G所示,其邻接矩阵为图3arcs。
图2.有向图图3.矩阵arcs
有向图的邻接矩阵arcs[i][j]定义为
intarcs[n][n];
2)概要设计
对用邻接矩阵表示的有向图,从某一顶点出发(称为源点)到该图其他各顶点(称为终点)有无路径?
最短路径是什么?
路径长为多少?
问题要求写一个程序从有向图中的某一顶点出发找出该顶点到其余各顶点的最短路径。
对邻接矩阵arsc[n][n]中的每一个元素只能有三种情况:
①当i=j时,p[i][j]=0;②当顶点i到j无边时,p[i][j]=MAX;③当顶点i到j有边且权值为arcs[i][j]时,p[i][j]=arcs[i][j].
建立图的表示模块,顶点的插入和删除操作模块;在建立图之后从单源点开始求最短路径,并显示出来!
流程图如图
Dijkstra算法描述如下:
(1)输入顶点个数n,边的条数,初始化邻接矩阵。
(2)初始化所每条边的权值与D[h]中
(3)①找出v0到图中其他各点的最小值
②经过改最小值的点到除它外其他各点的最小值
③直到s中的所有值全部被处理过,
(4)输出各最短路径的长度D[w]
3、详细设计和编码
定义typedefstructArcCell
{
intdata;//权值
}ArcCell,AdjMatrix[20][20];
typedefstruct
{inte;//弧数
charvexs[20];//一维数组存储顶点
AdjMatrixarcs;//二维数组存储边
intn;//顶点数
}MGraph,*AMGraph;//邻接矩阵的数据类型
创建有向图,以领结矩阵为存储结构创建有向图。
输入顶点数和狐数后,初始化每条边的权值和其他信息。
再应用循环for(i=0;i
for(j=0;j
G->arcs[i][j].data=N;//把个点之间路径都赋值为最大值
for(k=0;k
{//构造邻接矩阵
printf("输入第%d条弧的头结点,尾结点,权值:
\n",k);
x=getchar();
a=getchar();
y=getchar();
scanf("%d",&w);//输入每条边的顶点及权值
a=getchar();
i=LovateVex(G,x);
j=LovateVex(G,y);
G->arcs[i][j].data=w;//弧
}
returnG;
Dijkstra算法:
v0到其他各点的最短路径
(1)输入顶点个数n,边的条数,初始化邻接矩阵。
(2)初始化所每条边的权值与D[h]中
(3)①找出v0到图中其他各点的最小值
②经过改最小值的点到除它外其他各点的最小值
③直到s中的所有值全部被处理过,
(4)输出各最短路径的长度D[w]
4、上机调试、
在调试过程中刚开始是以字符数组的形式输出路径,后来发现在输出路径过程中输出结果为错误的,经过在同学的帮组下,修改后还是又错误,最后还是决定不采用字符数组输出结果,采用直接显示符,结果显示正确。
当然在显示领结矩阵的时候,王老师说我显示的结果不太好,因为显示领结矩阵不是太明显,他建议我用文件的形式输出,这样显示的结果可能比较好。
可是文件这一部分我都忘记了,而且之间从文件中显示矩阵,真的很难,真的不知怎么写。
这是这次程序的唯一遗憾。
算法的时间和空间性能分析
1时间复杂度
对于n个顶点的图,求一个顶点到其他顶点的最短路径,循环一次,加上修改最短路径的循环,是二层循环,所以,时间复杂度是O(n2)。
2空间复杂度
因为这个程序旨在求出最短路径,但是必然要涉及到图的存储,而对于Dijkstra算法弄清楚两个顶点之间的关系又显得尤为重要,所以,面对图的几种存储结构,用邻接表是比较合适的,不过它的缺点是占用空间大,复杂度为O(n2+m*n)。
心得体会:
通过本次课程设计,对关于图的一些基本运算有了一些掌握,例如创建图以领结矩阵为存储结构,其中第一个一维数组vexs,用来存储图中顶点的信息;另外一个二维数组arcs,用来存储图中边的信息;还有判断图中vi和vj是否相连,则只需判断G.arcs[i][j]是否为0即可。
图的应用很多,也很广泛。
图能够在计算机中存在,首先要捕捉他有那些具体化、数字化的信息,比如说权值、定点个数等,这也就说明了想要把生活中的信息转化到计算机中必须用数字来完整的构成一个信息库,而图的存在,又涉及到了顶点之间的联系。
图分为有向图和无向图,而无向图又是有向图在权值双向相等下的一种特例。
Dijkstra算法的程序很简短,但是有点复杂,应用的小知识点很多,就是要找出指定顶点v0为源点,求从v0到图中其他顶点的最短路径。
在每次操作中都是从顶点一步一步找最近的路线并与其直接距离相比较,在程序中开始定义一个标志数组ins[],标志每个顶点是否被处理过。
D[v]存放源点到每个顶点的权值,p[h]存放字符处理。
感觉该算法虽然简短,但是涉及到的知识点很多,很复杂,每一小步错误,可能就导致程序不能运行。
,在计算机中实现这么一个很简单的想法就需要涉及到很多转业知识和内容,为了完成设计,基本在前期工作中,都是以学习C语言为主,经常看书了解其中内容,比如说在程序中,删除顶点和增加顶点的模块中都有和建图模块相互重复的函数。
看到同学们的程序后,感觉自己的程序太简短了,想增大程序,可是每次都会出现错误,后来请教同学后就成功了。
还是感觉自己学的不是很好,不懂的知识点还有很多。
以后真的要多写程序,多锻炼自己,这样才会学好。
5、测试结果及其分析
测试结果为:
结果分析:
开始输入所有信息,用来创建图,下面结果2是执行该程序的功能,用来实现算法。
三个点为:
asd计算结果得a到a长度为0
A到s长度为2
A到d长度为3
结果显示正确,即为程序所得结果
6、用户使用说明
1执行程序后,执行以下操作:
输入顶点数
输入弧数
输入每个顶点的名称
输入每条边的所有信息
输入该图的顶点
2循环执行下面的操作:
输入您要操作的序号,即执行的功能选择
3循环结束
7、参考文献
序号:
ISBN978-7-113-07628-3/TP.2201作者:
王昆仑李红书名:
数据结构与算法出版地:
北京市宣武区右安门西街8号出版社名称:
《中国铁道出版社》出版社年份2007
8、附录
#include"stdio.h"
#include"string.h"
#include"malloc.h"
#include"stdlib.h"
#defineN100//最大值
#defineL10
typedefstructArcCell
{intdata;//权值
}ArcCell,AdjMatrix[20][20];
typedefstruct
{inte;//弧数
charvexs[20];//一维数组存储顶点
AdjMatrixarcs;//二维数组存储边
intn;//顶点数
}MGraph,*AMGraph;//邻接矩阵的数据类型
intLovateVex(MGraph*G,charv)//ding点定位算法,如果G中有v返回v的序号
{inti;
for(i=0;i<=G->n;i++){
if(v==G->vexs[i])returni;}
return(-1);}
MGraph*Create(MGraph*G)
{intw,i,j,k;//采用数组(邻接矩阵)表示法
charx,y,a;
printf("输入顶点数:
\n");scanf("%d",&G->n);
printf("输入弧数:
\n");scanf("%d",&G->e);
a=getchar();
for(i=0;i
{printf("输入第%d顶点名称(字符):
",i);
scanf("%c",&G->vexs[i]);
a=getchar();}//构造顶点向量
for(i=0;i
for(j=0;j
G->arcs[i][j].data=N;//把个点之间路径都赋值为最大值
for(k=0;k
{printf("输入第%d条弧的头结点,尾结点,权值:
\n",k);
x=getchar();a=getchar();y=getchar();
scanf("%d",&w);//输入每条边的顶点及权值
a=getchar();
i=LovateVex(G,x);
j=LovateVex(G,y);
G->arcs[i][j].data=w;}//弧
returnG;}
voidprint(MGraph*G){//输出图的邻接矩阵
inti,j,k;
for(i=-1;i
if(i==-1){printf("\n");printf("┃");printf("");
for(k=0;k
printf("%4c%d",G->vexs[k],k);
printf("┃\n");printf("┃");}
else{printf("%4c%d",G->vexs[i],i);
for(j=0;j
printf("%4d",G->arcs[i][j]);
printf("┃\n");printf("┃");}}
voidDijkstra(MGraph*G,intv0)
{intv,D[20],p[20][20],w,i,min,ins[20],t=0;
for(v=0;v
{ins[v]=0;//标志该顶点是否被处理
D[v]=G->arcs[v0][v].data;//v0到每个顶点的权值
for(w=0;w
//若p[v][w]为1,则W是从V0到V当前求的最短路径的顶点
if(D[v] {p[v][v0]=1;}}//找出v0到v的最短路径 D[v0]=0;//v0到vo的值赋值为0 ins[v0]=1;//表示v0已被访问 for(i=1;i {min=N; for(w=0;w if(! ins[w]) if(D[w] {v=w;min=D[w];} ins[v]=1;//直到集合s中所有点都被处理过 for(w=0;w //v0经过最小值点到其他个点的值和vo直接到这个点的距离的比较 if(! ins[w]&&(min+G->arcs[v][w].data {//例如a->c为1,c->d为2,a->d为8,即最小值就为它们的和 D[w]=min+G->arcs[v][w].data;}} for(w=0;w if(D[w] printf("%c到%c的最短路径为%c-->",G->vexs[v0],G->vexs[w],G->vexs[v0]); printf("%c长度为: %d\n",G->vexs[w],D[w]);} else printf("%c到%c两点之间没有最短路径! \n",G->vexs[v0],G->vexs[w]);}} voidmain() {charv;intv0,t;AMGraphM; system("color2E");//1是青;2是蓝色3是红4紫红5黄6白 M=(MGraph*)malloc(sizeof(MGraph));M=Create(M); printf("输入顶点v: ");scanf("%c",&v); v0=LovateVex(M,v); printf("\n你所建立图的领结矩阵如下: \n");print(M); printf("\n"); for(;;){ printf("┏━━━━Dijkstra算法功能实现━━━━\n"); printf("┃☆☆┃\n"); printf("┃★1、第一种显示路径★┃\n"); printf("┃☆☆┃\n"); printf("┃☆2、结束循环☆┃\n"); printf("┃★★┃\n"); printf("┗━━━━━━━━━━━━━━━━━━━\n"); printf("请输入您所要操作的序号: \n"); scanf("%d",&t);switch(t) {case1: printf("\n输入源顶点: "); scanf("%c",&v);getchar(); Dijkstra(M,v0);break;} if(t==2){printf("Dijkstra算法功能实现结束! \n");break;}}}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Dijkstra算法的实现数据结构与算法课程设计报告 Dijkstra 算法 实现 数据结构 课程设计 报告