用matlab深度优先搜索DFS寻找有向图环路
时间: 2023-10-13 18:06:41 浏览: 159
实现有向图的深度优先搜索算法
4星 · 用户满意度95%
以下是一个用matlab实现深度优先搜索(DFS)来寻找有向图环路的示例代码:
```matlab
function hasCycle = dfs(graph)
% graph表示有向图的邻接矩阵,hasCycle表示有向图中是否存在环路
n = size(graph, 1); % 有向图顶点数
visited = zeros(n, 1); % 标记每个顶点是否已访问过
onStack = zeros(n, 1); % 标记每个顶点是否在递归调用栈上
hasCycle = false; % 初始默认没有环路
for v = 1:n % 从每个顶点开始深度优先搜索
if ~visited(v)
hasCycle = dfsVisit(graph, visited, onStack, v);
if hasCycle % 如果存在环路则直接返回
return;
end
end
end
end
function hasCycle = dfsVisit(graph, visited, onStack, v)
% 在有向图中从顶点v开始深度优先搜索,visited和onStack记录访问状态,hasCycle表示是否存在环路
visited(v) = true; % 标记当前顶点已访问
onStack(v) = true; % 标记当前顶点在递归调用栈上
for w = find(graph(v,:)) % 遍历v的所有邻居节点w
if ~visited(w)
hasCycle = dfsVisit(graph, visited, onStack, w);
if hasCycle % 如果存在环路则直接返回
return;
end
elseif onStack(w) % 如果w已经在递归调用栈上,则存在环路
hasCycle = true;
return;
end
end
onStack(v) = false; % 当前顶点的所有邻居节点已经访问完毕,将其从递归调用栈上移除
hasCycle = false; % 当前顶点的所有邻居节点均已访问过,不存在环路
end
```
该代码中,dfs函数是主函数,dfsVisit函数是递归函数。在dfs函数中,我们从每个顶点开始深度优先搜索,如果存在环路则直接返回;在dfsVisit函数中,我们从顶点v开始访问其所有邻居节点w,如果w已经在递归调用栈上,则存在环路,否则继续访问w的邻居节点。在访问完v的所有邻居节点后,将其从递归调用栈上移除,返回当前顶点的访问状态。
阅读全文