有向无权图最短路径问题——BFS求解
2016-10-02 23:16
309 查看
解释
图1
如图1所示,这是一个有向无权图,如果选中某个定点作为起始顶点s,我们要找出s到其他所有顶点的最短路径问题。由于是无权的,所以我们只关心最短路径所包含的边数。这就是一个有向无权图求最短路径的问题,用到BFS算法,广义优先搜索算法。
流程解析
设s为选中的v3。从s出发路径长为1的顶点之后的图
此时可以看到从s出发到v3的最短路径长为0的路径,只有v3自己。把这个标记下来。然后寻找所有从s出发路径长为1的顶点,这些顶点可以通过考察s邻接的顶点找到。
找出所有从s出发路径长为1的顶点之后的图
现在寻找从s出发,最短路径为2 的顶点,找出所有邻接到v1和v6的顶点(距离为1处的顶点)。它们的最短路径还不知道,这次搜索告诉我们,到v2和v4的最短路径长为2。下图显示了到目前为止所做的工作。
找出所有从s出发路径长为2的顶点之后的图
最后通过考察那些邻接到刚被赋值的v2和v4的顶点可以发现,v5和v7各有一条三边的最短路径。现在所有顶点都已经计算。下图显示最终的算法结果。
上述搜索方法称为广度优先搜索(breadth first search)。该方法是按层处理顶点:距开始点最近的那些顶点首先被求值,而最远的那些顶点最后被求值。这很像对数的层序遍历(level order traversal)。
下图是用于求无权最短路径计算的表的初始配置
对于每个顶点,我们需要跟踪三个信息。known表示该顶点是否被处理,即求取到s的最短路径;距离d为所求取的路径长,开始被赋值无穷大,pv表示路径,通过追溯pv可以显示实际的路径长。
算法的伪代码如下
void Graph::unweighted(Vextex s) { for each Vertex v { v.dist=INFINITY; v.known=false; } s.dist=0; for(int currDist=0;currDist<NUM_VERTICES;currDist++) for each Vertex v if(!v.known&&v.dist==currDist) { v.known=true; for each Vertex w adjacent to v if(w.dist==INFINITY) { w.dist=currDist+1; w.path=v; } } }
上述代码运算复杂度是O(V^2)
下面给出使用O(V+E)复杂度的算法,类似于拓扑排序,使用连接表可以降低算法的时间复杂度为O(V+E)。
void Graph::unweighted(Vertex s) { Queue<Vertex> q; for each Vertex v v.dist=INFINITY' s.dist=0; q.enqueue(s); while(!q.isEmpty()) { Vertex v=q.dequeue(); for each Vertex w adjacent to v if(w.dist==INFINITY) { w.dist=v.dist+1; w.path=v; q.enqueue(w); } } }
上述算法的运行情况如下:
实际例子
代码参考:http://blog.csdn.net/linux_ever/article/details/51305596相关文章推荐
- BFS,Dijkstra,Floyd,DP求解最短路径问题
- 差限问题求解利用Bell-ford算法构造差限图通过最短路径求解
- 最短路径实现代码-->Dijkstra求解最短路径问题
- BFS 求最短路径问题
- 广度优先算法解决无向无权图的最短路径问题
- Dijstra算法实现求解单源最短路径问题
- 序列元素和、正则表达式匹配、BFS最短路径问题
- 每周算法练习——用动态规划求解最短路径问题
- 求解迷宫问题的所有路径及最短路径程序
- 单源无权最短路径举例——字梯问题
- 图论-BFS解无权有向图最短路径距离
- AStar算法求解迷宫最短路径问题
- Sicily9360(BFS无权图最短路径)
- 贪心法求解单源最短路径问题
- 关于A*算法求解最短路径问题的一些知识
- Dijkstra最短路径问题求解
- 2011.11.13 poj2251 如果要用到BFS或者DFS,如果最短路径的相关问题,那么肯定是BFS!!!不会是DFS!!!
- 最短路径问题(BFS)
- POJ 3984 迷宫问题【迷宫最短路径 bfs】
- 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)