图论及其应用课程论文—— 解决城市道路最短路问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图论及其应用
专业:计算机科学与技术
班级:图论及其应用5
学号:
姓名:
任课教师:
图论及其应用
——解决城市道路最短路问题
(重庆邮电大学计算机科学与技术学院,重庆重庆市400065)
E-mail: 1356310671@
【摘要】本文通过Dijkstra算法编程计算出重庆市主城九区任意两区间的最短路径,并在VC下实现一个顶点到其余各个顶点的所有最短路径的查找。
【关键字】最短路径Dijkstra算法
中图分类号 O157
1引言
当前城市的规模越来越大,交通道路状况也越来越复杂,从城市的一个地方到另一个地方可能有很多种路径,如何从众多的路径中选择距离最短或者所需时间最短的路径便成了人们关注的热点。能够选择出一条最符合条件的路径会给我们的日常生活带来极大地方便。本文就通过找城市各地之间的最短距离路径为例,详细的介绍经典的最短路径算法Dijkstra算法及其算法的实现。
2相关知识
定义2.1.1图G是一个有序二元组
定义2.1.2如果有两条边的端点是同一对顶点,则称这两条边为重复边。给定图G=(V,E),设v0,v1,……,v n∈V,e1,e2,……,e n∈E,其中e i是关联于结点v i-1,v i的边,交替序列称为联结v0到v n的路。当v0=v n时,这条路称作回路。
定义2.1.3若图G只有一个连通分支,则称G是连通图。设无向图G=(V,E)为连通图,若有边集E i⊂E,使图G中删除了E i的任一真子集后得到的子图是连通图,则称E i是G的一个边割集。若是E i单元集{e},则称e为割边或桥。
定义2.1.4设图G=
定义2.1.5结点v i到v j结点之间最短通路定义为v i到v j的最短路径。[1]
3Dijkstra算法概述
Dijkstra算法是由荷兰计算机科学家狄克斯特拉(Dijkstra)于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各定点最短路径算法,解决的是有向图中最短路径问题,当然对无向图也同样适用。Dijkstra算法用于计算一个
源节点到所有其他节点的最短代价路径,它是按路径长度递增的次序来产生最短路径的算法。【4】
其基本原理是:每次新扩展一个距离最短的点,更新与其相邻接的点的距离。当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。不过根据这个原理,用Dijkstra求最短路的图不能有负权边,因为扩展到负权边的时候会产生更短的距离,有可能就破坏了已经更新的点距离不会改变的性质。
举例来说,如果图中的顶点表示城市,而边上的权重表示各个城市间的距离,Dijkstra算法可以用来找到两个城市之间的最短路径。
4算法描述
4.1 基本思想
Dijkstra提出的是一种按路径长度递增的顺序产生最短路径的方法,即:把
图中所有顶点分成两组,第一组S包括已经确定最短路径的顶点,初始时只含有源点;第二组V-S中包括尚未包括最短路径的顶点,初始时含有图中除源点以外的所有其他顶点。按路径长度递增的顺序就是远点到各顶点的最短路径,逐个把第二组中的顶点加到第一组中去,直至S=V。【5】
4.2 实现思路
整个网络用邻接矩阵cost[][]表示,其中规定:(1)两个顶点之间无直接路径,即
点的最短路径经过的顶点。
4.3 计算步骤
(1)dist初始存放源点到各顶点的权值。
(2){dist(i)|Vi∈(V-S)}中最小值对应的顶点就是从源点Vi到其他顶点的最短路径中最短的一条所对应的顶点,即dist(j)=min{dist(i)∈(V—S)}。
(3)对于所有顶点Vk(Vk∈(V—S)),修改dist(k)的值:
dist(k)=min(dist[k],dist[j]+cost[j,k])
在修改后的dist[k]中进行第二步,求得第二个j,顶点Vj加入S集合中,第二条最短路径产生。重复(2)(3)步,直至求得从源点Vi到各顶点的最短路径为止。
5程序实现
网络为例,单从各个区的距
离来看,构成的网络是一个
无向图,由于我没有这些具
体的数据,所以假设各区之
间的交通道路组成如图1所
示。地名与各顶点的对应关
系如表1所示。
图1 重庆市交通道路网
5.1 数据结构定义
该网络用邻接矩阵存储,其结构定义如下:
#define MAXLEN 100
#define MAX 10000
typedef struct
{
string vexs[MAXLEN];//图中的顶点的信息
double arcs[MAXLEN][MAXLEN];//存放图信息的邻接矩阵
int vexnum,arcnum;//顶点的数目和边数
}MGRAPH;