d算法实现路由最短路径Word文档下载推荐.docx

上传人:b****5 文档编号:17013129 上传时间:2022-11-27 格式:DOCX 页数:14 大小:73.98KB
下载 相关 举报
d算法实现路由最短路径Word文档下载推荐.docx_第1页
第1页 / 共14页
d算法实现路由最短路径Word文档下载推荐.docx_第2页
第2页 / 共14页
d算法实现路由最短路径Word文档下载推荐.docx_第3页
第3页 / 共14页
d算法实现路由最短路径Word文档下载推荐.docx_第4页
第4页 / 共14页
d算法实现路由最短路径Word文档下载推荐.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

d算法实现路由最短路径Word文档下载推荐.docx

《d算法实现路由最短路径Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《d算法实现路由最短路径Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。

d算法实现路由最短路径Word文档下载推荐.docx

采用的是松弛技术,对在i和j之间的所有其他点进行一次松弛。

所以时间复杂度为O(n^3)。

Dijkstra算法是由荷兰计算机科学家艾兹格·

迪科斯彻发现的。

算法解决的是有向图中最短路径问题。

Dijkstra算法是一种求单源最短路的算法,即从一个点开始到所有其他点的最短路。

其基本原理是:

每次新扩展一个距离最短的点,更新与其相邻的点的距离。

当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。

不过根据这个原理,用Dijkstra求最短路的图不能有负权边,因为扩展到负权边的时候会产生更短的距离,有可能就破坏了已经更新的点距离不会改变的性质。

沈阳大学

课程设计说明书NO.2

举例来说,如果顶点表示城市,而边上的权重表示著城市间开车行经的距离。

Dijkstra算法可以用来找到两个城市之间的最短路径。

Dijkstra算法的输入包含了一个有权重的有向图G,以及G中的一个来源顶点S。

我们以V表示G中所有顶点的集合。

每一个边,都是两个顶点所形成的有序元素对。

(u,v)表示从顶点u到v有路径相连。

我们以E所有边的集合,而边的权重则由权重函数w:

E→[0,∞]定义。

因此,w(u,v)就是从顶点u到顶点v的非负花费值(cost)。

边的花费可以想像成两个顶点之间的距离。

任两点间路径的花费值,就是该路径上所有边的花费值总和。

已知有V中有顶点s及t,Dijkstra算法可以找到s到t的最低花费路径(i.e.最短路径)。

这个算法也可以找到从一个顶点s到任何其他顶点的最短路径。

2.2Dijkstra算法

基本步骤

令:

并令:

(1)对

,求

(2)求

,使

=

(3)若

则已找到

的最短路距离

,否则令

中删去

转1

第一步先取

意即

的距离为0,而

是对

所赋的初值。

第二步利用

已知,根据

进行修正。

第三步对所有修正后的

求出其最小者

其对应的点

所能一步到达的点

中最近的一个,由于所有

因此任何从其它点

中转而到达

的通路上的距离都大于

直接到

的距离

因此

就是

的最短距离,所以在算法中令

并从s中删去

若k=n则

的最短路线,

沈阳大学

课程设计说明书NO.3

计算结束。

否则令

回到第二步,继续运算,直到k=n为止。

表1各个顶点的距离:

6个顶点

10条边

起始顶点

目的顶点

距离

A

B

2

D

1

C

5

3

E

F

其路径图为:

课程设计说明书NO.4

图1路径图

Dijkstra算法代码为:

#include<

stdafx.h>

stdio.h>

stdlib.h>

string.h>

#defineMAX_NAME10

#defineMAX_VERTEX_NUM26

typedefcharVertexType[MAX_NAME];

typedefintAdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

//邻接距阵

structMGraph//定义网

{

VertexTypevexs[MAX_VERTEX_NUM];

AdjMatrixarcs;

intvexnum,arcnum;

};

intLocateVex(MGraphG,VertexTypeu)//定位

{

inti;

for(i=0;

i<

G.vexnum;

++i)if(strcmp(u,G.vexs[i])==0)returni;

return-1;

}

voidCreateDN(MGraph&

G)//建网

课程设计说明书NO.5

inti,j,k,w;

VertexTypeva,vb;

printf("

请输入有向网G的顶点数和弧数(以空格作为间隔)\n"

);

scanf("

%d%d"

&

G.vexnum,&

G.arcnum);

请输入%d个顶点的值(<

%d个字符):

\n"

G.vexnum,MAX_NAME);

++i)

%s"

G.vexs[i]);

for(j=0;

j<

++j)

G.arcs[i][j]=0x7fffffff;

请输入%d条弧的弧尾弧头权值(以空格作为间隔):

\n"

G.arcnum);

for(k=0;

k<

G.arcnum;

++k)

%s%s%d%*c"

va,vb,&

w);

i=LocateVex(G,va);

j=LocateVex(G,vb);

G.arcs[i][j]=w;

typedefintPathMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedefintShortPathTable[MAX_VERTEX_NUM];

voidShortestPath_DIJ(MGraphG,intv0,PathMatrixP,ShortPathTableD)

intv,w,i,j,min;

intfinal[MAX_VERTEX_NUM];

for(v=0;

v<

++v)

final[v]=0;

D[v]=G.arcs[v0][v];

for(w=0;

w<

++w)

P[v][w]=0;

if(D[v]<

0x7fffffff)

P[v][v0]=P[v][v]=1;

D[v0]=0;

final[v0]=1;

for(i=1;

课程设计说明书NO.6

min=0x7fffffff;

if(!

final[w]&

&

D[w]<

min)

v=w;

min=D[w];

final[v]=1;

++w)

min<

0x7fffffff&

G.arcs[v][w]<

(min+G.arcs[v][w]<

D[w]))

D[w]=min+G.arcs[v][w];

++j)

P[w][j]=P[v][j];

P[w][w]=1;

intmain()

inti,j;

MGraphg;

PathMatrixp;

ShortPathTabled;

CreateDN(g);

ShortestPath_DIJ(g,0,p,d);

//以g中位置为0的顶点为源点,球其到其余各顶点的最短距离。

存于d中

最短路径数组p[i][j]如下:

g.vexnum;

++i)

%2d"

p[i][j]);

%s到各顶点的最短路径长度为:

g.vexs[0]);

if(i!

=0)

if(d[i]-0x7fffffff)printf("

%s-%s:

%d\n"

g.vexs[0],g.vexs[i],d[i]);

else

课程设计说明书NO.7

无路\n"

g.vexs[0],g.vexs[i]);

system("

PAUSE"

return0;

3.设计结果与分析

3.1运行结果

图2输入数据

课程设计说明书NO.8

图3运行结果

3.2结果分析

利用Dijkstra算法给出顶点和边的个数,经过程序的计算的出最短路由的矩阵,其计算过程是:

表2算法的计算过程

N

{A}

{A,D}

4

{A,D,E}

{A,B,D,E}

{A,B,C,D,E}

{A,B,C,D,E,F}

课程设计说明书NO.9

得出最短的路径图为:

图4最短路径图

在VC++6.0运行环境中程序以A节点为源节点生成最短路径,它的产生过程是:

建立一个以源节点A为根的最短路径树,直到包括最远的节点在内为止。

第k步,计算到离源节点最近的k个节点的最短路径。

这些路径定义在集N内。

本程序将最短路理论应用到实际生活中,尤其是在实际的应用中的应用具有很重要的意义。

将实际生活中出现的安全隐患尽量降低,同时也凸显出学习和应用最短路问题原理的重要性。

另外,最短路问题在城市道路建设、物资供应站选址等问题上也有很重要的作用。

分析和研究最短路问题趋于热门化。

4.设计体会

通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。

把死板的课本知识变得生动有趣,激发了学习的积极性。

使我加深了对课堂抽象概念的理解,巩固了课堂上所学的理论知识,并且很好地理解与掌握信号处理中的采样与重构的基本概念、基本原理、基本分析方法,同时培养了我的综合设计能力与实际工作能力,综合素质得到较大提高。

这次课程设计的基本目的在于运用学习成果,检验学习成果。

课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意指针,将不必要的命令去除。

在这次课程设计中,我就是按照实验指导的思想来完成。

加深了理解文件系统的内部功能及内部实现,培养实践动手能力和程序开发能力的目的。

运用学习成果,把课堂上学到的系统化的理论知识,尝试性地应用于实际设计工作,并从理论的高度对设计工作的现代化提出一些有针对性的建议和设想。

同时它也检验课堂学习与实际工作到底有多大距离,并通过综合分析,找出学习中存在的不足,以便为完

课程设计说明书NO.10

善学习计划,改变学习内容与方法提供实践依据。

对于我们来说,实际能力的培养至关重要,而这种实际能力的培养单靠课堂教学是远远不够的,必须从课堂走向实践。

课是通过对软件开发流程的了解,进一步激发了我们对专业知识的兴趣,并能够结合实际程设计达到了专业学习的预期目的。

在一个星期的课程设计之后,我们普遍感到不仅实际动手能力有所提高,更重要的存在的问题在专业领域内进行更深入的学习。

5.参考文献

[1]鲜继清.现代通信系统.西安:

西安电子科技大学出版社,2003.2:

342-356

[2]唐宝民.通信网基础[M].北京:

机械工业出版社,2004:

300-303

[3]郑阿奇.VisualC++实用教程.北京:

电子工业出版社,2007:

140-164

[4]唐宝明,张颖.通信网基础[M].北京:

机械工业出版社2007-12:

300-301

[5]魏亮,李春葆.VisualC++程序设计例学与实践[M].北京:

清华大学出版社 

2006-6:

45-98

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

当前位置:首页 > 小学教育 > 数学

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

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