DFS求图中两点的所有的路径
2018-01-12 15:25
330 查看
用DFS算法来求图中两点的所有的路径,在给出代码前,先给大家讲解清楚该算法的原理。
DFS本来被用作图的遍历,现在我们对它进行改造,成为求两点间的所有路径的工具。
先定义如下图:
如何从图中的v1找到到v4的所有路径呢?来看下面步骤:
1.从v1出发,将v1标记,并将其入栈。
2.找到v0,将其标记,将其入栈。
3.找到v4,将其标记,入栈。v4是终点,将栈中的元素从栈底往栈顶输出,即为一条路径。v4出栈,并取消标记,回溯到v0。
4.v0除v4外无其它出度,将v0出栈,并取消标记,回溯到v1。
5.找到v2,将其标记并入栈。
6.找到v0,将其标记并入栈。
7.找到v4,将其标记,入栈。v4是终点,将栈中的元素从栈底往栈顶输出,即为一条路径。v4出栈,并取消标记,回溯到v0。
8.v0除v4外无其它出度,将v0出栈,并取消标记,回溯到v2。
9.找到v3,将其标记并入栈。
10.找到v4,将其标记,入栈。v4是终点,将栈中的元素从栈底往栈顶输出,即为一条路径。v4出栈,并取消标记,回溯到v3。
11.v3除v4外无其它出度,将v3出栈,并取消标记,回溯到v2。
12.v2除v0,v3外无其它出度,将v2出栈,并取消标记,回溯到v1。
13.v1除v0,v2外无其它出度,将v1出栈,栈空,结束遍历。
好,上述便是对v1到v4所有路径的遍历,相信大家也懂得了,下面便给出c++代码顺序结构图的实现,链式原理也一样:
DFS本来被用作图的遍历,现在我们对它进行改造,成为求两点间的所有路径的工具。
先定义如下图:
如何从图中的v1找到到v4的所有路径呢?来看下面步骤:
1.从v1出发,将v1标记,并将其入栈。
2.找到v0,将其标记,将其入栈。
3.找到v4,将其标记,入栈。v4是终点,将栈中的元素从栈底往栈顶输出,即为一条路径。v4出栈,并取消标记,回溯到v0。
4.v0除v4外无其它出度,将v0出栈,并取消标记,回溯到v1。
5.找到v2,将其标记并入栈。
6.找到v0,将其标记并入栈。
7.找到v4,将其标记,入栈。v4是终点,将栈中的元素从栈底往栈顶输出,即为一条路径。v4出栈,并取消标记,回溯到v0。
8.v0除v4外无其它出度,将v0出栈,并取消标记,回溯到v2。
9.找到v3,将其标记并入栈。
10.找到v4,将其标记,入栈。v4是终点,将栈中的元素从栈底往栈顶输出,即为一条路径。v4出栈,并取消标记,回溯到v3。
11.v3除v4外无其它出度,将v3出栈,并取消标记,回溯到v2。
12.v2除v0,v3外无其它出度,将v2出栈,并取消标记,回溯到v1。
13.v1除v0,v2外无其它出度,将v1出栈,栈空,结束遍历。
好,上述便是对v1到v4所有路径的遍历,相信大家也懂得了,下面便给出c++代码顺序结构图的实现,链式原理也一样:
void DFS(int start,int end)//深搜入栈查询所有路径 { visited[start] = true;//visited数组存储各定点的遍历情况,true为已遍历(标记) stack.Push(某个顶点);//入栈 for (int j = 0; j < list.Size(); j++) { if (start== end) {//找到终点 for (int i=0; i < stack.Size()-1; i++) { //输出从栈底到栈顶的元素,即为一条路径 } stack.Pop();//出栈 visited[start] = false; break; } if (!visited[j]) {//该顶点未被访问过 DFS(j,end); } if (j == list.Size() - 1 ) {//如果该顶点无其它出度 stack.Pop(); visited[start] = false; } } }
相关文章推荐
- 使用DFS求任意两点的所有路径
- 图论算法-求(有向)图中任意两点间所有路径
- 计算无向无权图中两点间所有的最短路径
- SRM 627 D1L2:GraphInversions,DFS,求所有指定长度的路径, Binary indexed tree (BIT)
- 求无向图中任意两点的所有路径
- 求两点之间的所有的路径
- 深度优先搜索,两点间所有路径
- 设计并实现求两点间所有路径的算法
- Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)
- 图两点间的最短路径,所有路径算法C语言实现
- 遍历寻找给定两点之间的所有路径
- 走迷宫sdut1269(附带dfs求所有路径与bfs求最佳路径)
- 快速寻找有向图中两点间的所有路径
- 无向连通图中两点间所有路径的算法
- 保存一棵树根到叶子之和为给定值的所有路径的DFS解法
- acm题目及我的程序(2)——Knight Moves (骑士跳跃) ——任意两点间的最短路径所有信息(算法1)
- 求两点之间所有路径的算法
- 两点之间的所有最短路径
- acm题目及我的程序(2)——Knight Moves (骑士跳跃) ——任意两点间的最短路径所有信息(算法2)
- C++计算图任意两点间的所有路径