最短路径算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最短距离算法(Dijkstra)设计与编程实现

所在系(院):

专业:

班级:

学号:

姓名:

绪论

随着知识经济的到来,信息将成为人类社会财富的源泉,网络技术的飞速发展与广泛应用带动了全社会对信息技术的需求,最短路径问题作为许多领域中选择最有问题的基础,在电子导航,交通旅游,城市规划以及电力、通讯等各种管网、管线的布局设计中占有重要地位。

最短路径,顾名思义就是在所有的路径中找到距离最短的路径,而我们所说的最短路径通常不仅仅指地理意义的距离最短,还可以引申到其他的度量,如时间、费用、路线容量等。相应地,最短路径问题就成为最快路径问题,最低费用问题等,所以我们所说的最短路径也可以看做是最优路径问题。

最短路径问题在交通网络结构的分析,交通运输线路的选择,通讯线路的选择与维护,运输货流的最小成本分析,城市公共交通网络的规划等,都有直接应用的价值。最短路径问题在实际中还应用于汽车导航系统以及各种应急系统等,这些系统一般要求计算出到出事点的最佳线路,在车辆行驶过程中还需要实时的计算出车辆前方的行驶路线,这就决定了最短路径问题的实现应该是高效的。

最短路径问题一直是计算机学科,运筹学,交通工程学,地理信息学等学科的一个研究热点。经典的图论与不断发展完善的计算机数据结构及算法的有效结合使得新的最短路径算法不断的涌现。

1 定义概览

Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。

问题描述:在无向图G=(V,E) 中,假设每条边E[i] 的长度为w[i],找到由顶点V0 到其余各点的最短路径。(单源最短路径)

2 概要设计和数据结构选择

按路径长度递增的顺序产生最短路径。通过以上对问题的分析和任务的理解,设计出一个大体的模块和程序流程。

2.1程序中涉及到的结构体及子函数:

2.1.1结构体:

本程序设计使用了以下结构体:

struct vertex

{ int num; //顶点编号

int data; //顶点信息

}; //顶点类型

typedef struct graph

{

int n; //图中顶点个数

int e; //图中边的个数

struct vertex vexs[MAXVEX]; //顶点集合

int edges[MAXVEX][MAXVEX]; //边的集合

}AdjMaxix; //图的邻接矩阵类型

2.1.2子函数:

设计本程序需分成几个模块,要用到以下几个子函数:

AdjMaxix creatmgraph() //通过用户交互产生一个有向图的邻接矩阵;

void dispmgraph(AdjMaxix adj)//用于输出一个有向图的邻接矩阵;

void ppath(int path[],int i,int v0);

//选择输出一条最短路径

void DisPath(int dist[],int path[],int s[],int n,int v0) //用path计算最短路径

void Dijkstra(AdjMaxix g,int v0) // Dijkstra算法void change(int num) //用于替换顶点编号

2.1.3结构图与流程图

结构图如图1

图1 结构图

流程图如图2

3.详细设计和编码

这里设计用邻接矩阵解决实际生活中城市间往返最短路径问题。

3.1算法思想

把图中顶点集合分成两组,第一组为集合S,存放已求出其最短路径的顶点,第二组为尚未确定最短路径的顶点集合是V-S(用U表示),其中V为网中所有顶点集合。在这里我们设计一个有向图G=(V,E)为G地区的交通图。

在这个图中,V=(1,2,……,N)代表各个城市。edges是表示G的邻接矩阵,edges[I][j]表示有向边的权,这里的权值代表城市间距离。若不存在有向边的权,则edges[I][j]的权为无穷大(可取值为INF=32570)。设S 为一个集合,其中的每个元素表示一个城市,求出从源点(自定义)城市到这些顶点城市的最短距离。S的初态只包含顶点V0。数组dist记录从V0到其他各城市当前的最短距离,其初值dist[I]=edges[V0][I]。从S之外的顶点集合V-S中选出一个城市u。使dist[w]的值最小。于是从源点到达u只通过S中的城市,把u加入集合S中调整dist中记录的从源点到V-S中每个城市V的距离:从原来的dist[v]和dist[w]+edges[w][v]中选择较小的值作为新的dist[v]。重复上述过程,直到S中包含V中其余顶点的最短路径。

3.1.1算法描述

void Dijkstra(AdjMaxix g,int v0)

{int dist[MAXVEX],path[MAXVEX];

int s[MAXVEX];

int mindis,i,j,u,n=g.n;

for(i=0;i

{

dist[i]=g.edges[v0][i];

s[i]=0;

if(g.edges[v0][i]

path[i]=v0;

else

path[i]=-1;

}

s[v0]=1;path[v0]=0;

for(i=0;i

{

相关文档
最新文档