DFS求图中两点的所有的路径

          用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++代码顺序结构图的实现,链式原理也一样:

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;
		}
	}
}


  • 28
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
在Matlab,可以使用邻接矩阵来表示无向图的连接关系。若图有n个节点,则邻接矩阵A的大小为n×n,其A(i, j)表示节点i与节点j是否相连接。 要求两点之间的所有路径,可以使用递归的方法来实现。具体步骤如下: 1. 定义一个递归函数,函数输入为当前节点current、终止节点target、已经访问的节点visited、当前路径path。 2. 判断当前节点是否为目标节点,如果是,则将当前路径加入到结果。 3. 如果不是目标节点,则遍历当前节点的所有邻居节点, - 如果邻居节点未被访问且不在当前路径,标记该邻居节点为已访问,将节点加入当前路径,并递归调用函数。 - 递归返回后,将当前节点从已访问节点移除,将其从当前路径移除。 4. 返回最终的结果。 以下是一个示例代码: ```matlab function result = getAllPaths(graph, start, target) result = {}; visited = zeros(1, size(graph, 1)); path = []; dfs(start); function dfs(current) if current == target result{end+1} = path; else visited(current) = 1; path = [path, current]; neighbors = find(graph(current, :)); for i = 1:length(neighbors) if ~visited(neighbors(i)) && ~ismember(neighbors(i), path) dfs(neighbors(i)); end end visited(current) = 0; path(end) = []; end end end ``` 调用示例: ```matlab graph = [0 1 1 0; 1 0 1 1; 1 1 0 0; 0 1 0 0]; % 无向图邻接矩阵 start = 1; % 起始节点 target = 3; % 终止节点 result = getAllPaths(graph, start, target); for i = 1:length(result) disp(result{i}); end ``` 上述示例代码,输入的无向图邻接矩阵为graph,起始节点为start,终止节点为target。最后会输出所有从起始节点到终止节点的路径

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值