您的位置:首页 > 其它

求两点间所有路径的遍历算法

2013-12-23 10:45 393 查看
1、深度优先遍历

1.1 深度优先遍历的定义

深度优先搜索(Depth_First Search)遍历类似于树的先根遍历,是树的先根遍历的推广。

假设给定图G,图中所有顶点未曾被访问过,则深度优先搜索可以从图中某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。这是一个递归的过程。

1.2 图的深度优先遍历的过程

假设给定图G,设x 是当前被访问顶点, 在对x 做过访问标记后, 选择一条从x出发的未检测过的边(x,y)。若发现顶点y 已访问过,则重新选择另一条从x 出发的未检测过的边,否则若顶点y未被访问过,沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过;然后从y开始搜索,直到搜索完从y 出发的所有路径,即访问完所有从y 出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x 出发的未检测过的边。上述过程直至从x
出发的所有边都已检测过为止。此时,若x 不是源点,则回溯到在x 之前被访问过的顶点;否则图中所有和源点有路径相通的顶点(即从源点可达的所有顶点)都已被访问过,若图G 是连通图,则遍历过程结束,否则继续选择一个尚未被访问的顶点作为新源点,进行新的搜索过程。

2、求两点间所有路径的算法



图1 连通图G



图2 G的邻接表存储结构
假设简单连通图如图1 所示,那么它的邻接表存储结构如图2 所示。假设我们要找出结点3到结点6的所有路径,那么,我们就设结点3为起点,结点6为终点。我们需要的存储结构有:一个保存路径的栈、一个保存已标记结点的数组,那么找到结点3到结点6的所有路径步骤如下:

(1)我们建立一个存储结点的栈结构,将起点3 入栈,将结点3 标记为入栈状态;

(2)从结点3 出发, 找到结点3 的第一个非入栈状态的邻结点1,将结点1 标记为入栈状态;

(3)从结点1 出发, 找到结点1 的第一个非入栈状态的邻结点0,将结点0 标记为入栈状态;

(4)从结点0 出发, 找到结点0 的第一个非入栈状态的邻结点2,将结点2 标记为入栈状态;

(5)从结点2 出发, 找到结点2 的第一个非入栈状态的邻结点5,将结点5 标记为入栈状态;

(6)从结点5 出发, 找到结点5 的第一个非入栈状态的邻结点6,将结点6 标记为入栈状态;

(7)栈顶结点6 是终点, 那么, 我们就找到了一条起点到终点的路径,输出这条路径;

(8)从栈顶弹出结点6,将6 标记为非入栈状态;

(9)现在栈顶结点为5, 结点5 没有除终点外的非入栈状态的结点,所以从栈顶将结点5 弹出;

(10)现在栈顶结点为2,结点2 除了刚出栈的结点5 之外,还有非入栈状态的结点6,那么我们将结点6 入栈;

(11)现在栈顶为结点6,即找到了第二条路径,输出整个栈,即为第二条路径;

(12)重复步骤2-11,就可以找到从起点3 到终点6 的所有路径;

(13)栈为空,算法结束。

3、求两点间所有路径算法的实现

实验平台:VisualStudio 2010

实验内容:地图两节点间所有路径的求解

原始数据:南京师范大学仙林校区北区路网矢量数据、路网节点数据、遥感影像数据

开发语言:C#

开发环境:ArcEngine10.1



图3 南京师范大学仙林校区北区路网图



图4 道路网数据的邻接表存储结构



图5 实现效果
如图5所示,选取道路起始点,道路网数据按邻接表结构存储,点击所有路径后,按照前述算法原理,系统将求解出两点间的所有路径,每条路径所经过的节点将在系统右侧的listbox中显示,通过对每条路径的长度比较,还可以求出两点间的最短路径并显示在地图中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: