数据结构论文.docx
《数据结构论文.docx》由会员分享,可在线阅读,更多相关《数据结构论文.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构论文
数据结构课程设计报告
设计题目:
用迪杰斯特拉算法实现最短路径算法
班级:
————————
组员:
————————
数据结构课程设计任务书
专业:
班级:
082
课程名称:
数据结构
学生姓名:
发题时间:
2011年4月24日
一、课题名称
用迪杰斯特拉算法实现最短路径算法
二、课题条件
参考文献:
谭浩强C程序设计清华大学出版社第三版
严蔚敏吴伟民数据结构清华大学出版社
三、设计任务
用迪杰斯特拉算法实现最短路径算法
用一定的数据结构表示教材p188,图7.34
对该图使用迪杰斯特拉算法计算v0到其它各点的最短路径
输出最后结果(最短路径长度和路径节点)和必要的中间步
骤,包括如p190的中间矩阵
4、设计说明书(或论文)内容
前言、问题描述、具体理论知识点、具体实例、程序清单、程序实现、参考文献、总结、小组成员分工合作清单
5、进度计划(列出完成项目设计内容、绘图等具体起始日期)
.........................
指导教师
(签名):
年月日
教研室主任
(签名):
年月日
课程设计综合成绩评定表
课程名称
数据结构课程设计
设计题目
用迪杰斯特拉算法实现最短路径算法
指导教师评语
指导教师签字:
年月日
设计报告成绩综合评定
项目
等级
1、计算和绘图能力
2、综合运用专业知识能力
3、运用计算机能力和外语能力
4、查阅资料、运用工具书的能力
5、独立完成设计能力
6、书写情况(文字能力、整洁度)
7、表述能力(逻辑性、条理性)
学生姓名
学生班级
平时考核成绩
设计考核成绩
综合成绩
杨建强
信计082
张小英
信计082
王娜
信计082
指导教师签名:
教研室主任签名:
年月日年月日
用迪杰斯特拉算法实现最短路径算法
1摘要:
。
。
。
。
。
关键字:
图带权图邻接矩阵迪杰斯特拉算法
目录:
1问题分析和任务定义
2逻辑设计
2.1图的储存
2.2邻接矩阵
3.3算法流程图:
3详细设计
3.1核心算法
Dijkstra算法
3.2图的数据结构
3.3邻接矩阵
4程序编码
5调试与测试
6结果分析
7总结
1问题分析:
用迪杰斯特拉算法实现最短路径算法
用一定的数据结构表示教材p188,图7.34
对该图使用迪杰斯特拉算法计算v0到其它各点的最短路径
输出最后结果(最短路径长度和路径节点)和必要的中间步骤,包括如p190的中间矩阵
。
。
。
..........
2逻辑设计:
2.1图的储存
1.引进辅助向量S,S[i]存储已求得最短路径的终点vi的集合
2.引进辅助向量D,D[i]存储当前找到的从源点到某个终点vi的最短路径,初值为
3.引进辅助向量P,P[v][w]为True表示w是从v0到v当前求得最短路径上的顶点
4.引入辅助向量final,final[v]为True且vS,表示已经求得从v0到v的最短路径D[v]
2.2邻接矩阵
输入:
带权有向图的邻接矩阵
输出:
n-1条最短路径
步骤:
Step1:
S={},从源点v0出发到图上其余各顶点vi(vi∈V),可能的最短路径长度的初值为:
Step2:
选择vj,使得D[j]=Min(i){D[i]|vi∈V-S},vj就是当前求得的一条从v0出发的最短路径的终点。
令S=SU{vj};
Step3:
修改从v0出发到集合V-S上任一顶点vk可达的最短路径长度。
如果D[j]+arcs[j][k]Step4:
重复Step2、Step3共n-1次。
求得从v0到其余各顶点的最短路径。
2.3算法流程图:
初始化D[I],P
对图中除源点外所有的点
找出一条最短路径(V0,V)
将顶点V加入S
经过v有一条最短路径(v0,v,w)
D[w]=min+G.arcs[v][w]
修改V-S中的顶点间最短路径长度
顶点并入S
3详细设计:
1.核心算法
Dijkstra算法:
迪杰斯特拉算法的原理
首先,引进一个辅助向量D,它的每个分量D表示当前所找到的从始点v到每个终点vi的最短路径的长度。
如D[3]=2表示从始点v到终点3的路径相对最小长度为2。
这里强调相对就是说在算法过程中D的值是在不断逼近最终结果但在过程中不一定就等于最短路径长度。
它的初始状态为:
若从v到vi有弧,则D为弧上的权值;否则置D为∞。
显然,长度为D[j]=Min{D|vi∈V}的路径就是从v出发的长度最短的一条最短路径。
此路径为(v,vj)。
那么,下一条长度次短的最短路径是哪一条呢?
假设该次短路径的终点是vk,则可想而知,这条路径或者是(v,vk),或者是(v,vj,vk)。
它的长度或者是从v到vk的弧上的权值,或者是D[j]和从vj到vk的弧上的权值之和。
一般情况下,假设S为已求得最短路径的终点的集合,则可证明:
下一条最短路径(设其终点为X)或者是弧(v,x),或者是中间只经过S中的顶点而最后到达顶点X的路径。
因此,下一条长度次短的最短路径的长度必是D[j]=Min{D|vi∈V-S}其中,D或者是弧(v,vi)上的权值,或者是D[k](vk∈S)和弧(vk,vi)上的权值之和。
迪杰斯特拉算法描述如下:
1)arcs表示弧上的权值。
若不存在,则置arcs为∞(在本程序中为MAXCOST)。
S为已找到从v出发的最短路径的终点的集合,初始状态为空集。
那么,从v出发到图上其余各顶点vi可能达到的最短路径长度的初值为D=arcs[LocateVex(G,v),i]vi∈V2)选择vj,使得D[j]=Min{D|vi∈V-S}3)修改从v出发到集合V-S上任一顶点vk可达的最短路径长度。
Dijkstra算法编码:
voidShortestPath_DIJ(MGraphG,intv0,PathMatrix*P,ShortPathTable*D)
{
intv,w,i,j,min;
intfinal[MAX_VERTEX_NUM];
for(v=0;v{
final[v]=0;
(*D)[v]=G.arcs[v0][v].adj;
for(w=0;w(*P)[v][w]=0;//设空路径
if((*D)[v]{
(*P)[v][v0]=1;
(*P)[v][v]=1;
}
}
(*D)[v0]=0;
final[v0]=1;//初始化,v0顶点属于S集
for(i=1;i{//开始主循环,每次求得v0到某个v顶点的最短路径,并加v到S集
min=INFINITY;//当前所知离v0顶点的最近距离
for(w=0;wif(!
final[w])//w顶点在V-S中
if((*D)[w]{
v=w;
min=(*D)[w];
}//w顶点离v0顶点更近
final[v]=1;//离v0顶点最近的v加入S集
for(w=0;w{
if(!
final[w]&&min&&(min+G.arcs[v][w].adj<(*D)[w]))
{
//修改D[w]和P[w],w∈V-S
(*D)[w]=min+G.arcs[v][w].adj;
for(j=0;j(*P)[w][j]=(*P)[v][j];
(*P)[w][w]=1;
}
}
}
}
2.图的定义与邻接矩阵
。
。
。
。
2.1.图的定义
数据元素间为多对多关系的数据结构,加上一组基本操作构成的抽象数据类型。
ADTGraph{
数据对象V:
V是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:
R={VR}
VR={|v,w(-V且P(v,w),表示从v到w的弧,谓词P(v,w)定义了弧的意义或信息}
2.2.1邻接矩阵
1用邻接矩阵来表示带权有向图:
MGraph*G;
(1)因为是带权图,G->edges[i][j]表示弧上的权值。
若不存在,则置G->edges[i][j]为
(表示一个能够识别的特殊的数)。
(2)辅助向量floatD[N]用来存储源点到其余各点的最短路径长度。
(3)辅助向量intP[N]用来存储源点到其余各点的最短路径。
因为求得最短路径的顺序是依路径中包含的边的数目按递增增顺序进行的,因此尽管路径用顶点序列来表示,我们对每条路径仅需要保存终点的前驱点即可。
因此可以用一个向量p来存放相应的路径,向量p的每个分量中的存放的仅是终点的前驱点,通过回溯的方法可以找到相应的最短路径。
如p[5]=3,说明到v5的最短路径的最后一段是从v3到达的,而怎样到达的v3,在v3的路径有存储。
4)辅助向量intfinal【N】用来表示集合S;final【j】=0,表示顶点j未进入集合S;final[j]=1,表示顶点j进入集合S,即它的最短路径已求得。
这样,它的初值除了源点对应的分量为1其余全为0。
用两个数组分别储存数据元素(顶点)的信息和数据元素之间的关系(边或弧)的信息。
储存表示:
typedefstructArcCell{
VRTypeadj;//VRType是顶点关系类型。
对无权图,
//用1或0表示是否相邻;对带权图用权值。
InfoType*info;//该弧相关信息的指针,
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
structMGraph//邻接矩阵图类型
{
VertexTypevexs[MAX_VERTEX_NUM];//顶点向量名称
AdjMatrixarcs;//邻接矩阵,结构体类型
intvexnum,arcnum;//图的当前顶点数和弧数,int类型
GraphKindkind;//图的种类标志,
};
因为此题中用到的是带权的有向图
则其邻接矩阵可定义为:
A[i][j]=
其中:
wij表示边上的权值;
∞表示一个计算机允许的、大于所有边上权值的数。
构造有向网:
intCreateDN(AdjMatrix*Net)
{
inti,j,k;
intweight;
VertexDatav1,v2;
printf("请输入图的顶点数和弧数:
");
scanf("%d%d",&Net->vexnum,&Net->arcnum);
//初始化邻接矩阵
for(i=0;ivexnum;i++)
for(j=0;jvexnum;j++)
Net->arcs[i][j].adj=infinity;
printf("请输入图的顶点:
\n");
for(i=0;ivexnum;i++)
scanf("%d",&Net->vexs[i]);
printf("请输入一条弧的两个顶点及权值:
\n");
for(k=0;karcnum;k++)
{
scanf("%d%d%d",&v1,&v2,&weight);
i=LocateVex(Net,v1);
j=LocateVex(Net,v2);
if(i<0||j<0)
returnfalse;
Net->arcs[i][j].adj=weight;//建立弧
}
returntrue;
}
2.2.2确定G中顶点的位置:
通过函数LocateVex(MGraphG,VertexTypeu)返回所需顶点在图G中的位置。
算法:
intLocateVex(MGraphG,VertexTypeu)
{
inti;
for(i=0;iif(strcmp(u,G.vexs[i])==0)
returni;
return-1;
}
5.邻接矩阵的输出:
例如:
5测试与分析
运行下图
运行程序:
输入定点数,弧数:
68
再输入顶点的值:
V0V1V2V3V4V5
输入弧头弧尾权值:
6总结