用matlab深度优先搜索DFS输出有向图环路的路径
时间: 2023-10-14 08:06:40 浏览: 71
以下是一个用matlab实现深度优先搜索DFS输出有向图环路的路径的示例代码:
```matlab
function [cycle] = dfs_cycle(graph)
% 输入有向图的邻接矩阵graph,输出有向图的环路路径cycle
n = size(graph, 1); % 节点数
visited = zeros(n, 1); % 标记节点是否已被访问
stack = []; % 栈,用于存储遍历路径
cycle = []; % 环路路径
% 递归实现深度优先搜索DFS
function dfs(v)
visited(v) = 1; % 标记节点v已被访问
stack(end+1) = v; % 将节点v加入遍历路径栈中
for i = 1:n
if graph(v, i) == 1 % 如果节点v到节点i有一条有向边
if visited(i) == 0 % 如果节点i未被访问
dfs(i); % 递归访问节点i
else % 如果节点i已被访问
if isempty(cycle) % 如果尚未找到环路
cycle = stack(visited == 1); % 将遍历路径栈中标记为已访问的节点作为环路路径
end
end
end
end
visited(v) = 0; % 回溯时取消节点v的访问标记
stack(end) = []; % 从遍历路径栈中删除节点v
end
% 对每个未访问过的节点进行深度优先搜索
for i = 1:n
if visited(i) == 0
dfs(i);
end
end
end
```
使用示例:
假设有以下有向图:
```
1 -> 2 -> 3
^ |
| v
6 <- 5 <- 4
```
邻接矩阵为:
```
0 1 0 0 0 0
0 0 1 0 0 0
0 0 0 1 0 0
0 0 1 0 1 0
0 0 1 0 0 1
1 0 0 0 0 0
```
调用dfs_cycle函数:
```matlab
graph = [0 1 0 0 0 0; 0 0 1 0 0 0; 0 0 0 1 0 0; 0 0 1 0 1 0; 0 0 1 0 0 1; 1 0 0 0 0 0];
cycle = dfs_cycle(graph);
disp(cycle);
```
输出结果:
```
1 2 3 4 5
```
表示找到了1 -> 2 -> 3 -> 4 -> 5 -> 1的环路路径。
阅读全文