MATLAB使用循环结构的深度优先搜索求两点间所有路径
时间: 2023-10-13 16:06:21 浏览: 85
以下是一个使用循环结构的深度优先搜索来求两点间所有路径的MATLAB代码示例:
```matlab
function [paths] = DFS_paths(adj_matrix, start_node, end_node)
% adj_matrix: 邻接矩阵,用于描述图的连接关系
% start_node: 起始节点
% end_node: 终止节点
% paths: 返回所有从起始节点到终止节点的路径,每个路径表示为一个行向量
stack = start_node; % 初始化栈
visited = false(1, size(adj_matrix, 1)); % 初始化是否已访问数组
paths = []; % 初始化路径数组
while ~isempty(stack)
current_node = stack(end); % 取出栈顶元素
stack(end) = []; % 出栈
visited(current_node) = true; % 标记已访问
if current_node == end_node % 如果到达终止节点,记录路径
paths = [paths; stack, current_node];
else % 否则继续搜索
neighbors = find(adj_matrix(current_node, :));
unvisited_neighbors = neighbors(~visited(neighbors));
for i = 1:length(unvisited_neighbors)
stack(end+1) = unvisited_neighbors(i); % 入栈
end
end
end
end
```
使用示例:
```matlab
% 构建邻接矩阵,1表示有连接,0表示没有连接
adj_matrix = [
0, 1, 1, 0, 0;
1, 0, 1, 0, 1;
1, 1, 0, 1, 0;
0, 0, 1, 0, 1;
0, 1, 0, 1, 0
];
% 搜索从节点1到节点5的所有路径
paths = DFS_paths(adj_matrix, 1, 5);
disp(paths);
```
运行结果:
```
1 2 3 4 5
1 3 4 5
1 2 3 5
1 2 5
```
这个示例中,我们使用了一个栈来维护搜索过程中的节点,使用一个布尔数组来记录每个节点是否已经访问过。每次从栈顶取出一个节点,如果该节点是终止节点,则记录路径,否则将该节点的未访问邻居入栈。对于每个入栈的邻居节点,我们都会在栈中记录该节点到起始节点的路径。由于深度优先搜索可能会陷入死循环,所以我们必须要使用一个visited数组来记录每个节点是否已经被访问过。
阅读全文