MATLAB:如何在有向图中找到任何周期中的节点?

时间:2018-04-26 13:30:30

标签: matlab

假设有向图A的邻接矩阵由

给出
0     1     0     0
1     0     0     0
0     1     0     0
0     0     0     1

然后任何周期中的节点都是

1 (1->2->1)
2 (2->1->2)
4 (4->4)

是否有一种有效的方法来获取任何周期中的节点列表?

我知道总结A,A ^ 2,A ^ 3,A ^ 4 ...并搜索非零对角线的工作,但我正在研究一个高维矩阵并且它需要太长时间。< / p>

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用dfsearchedgetodiscovered选项查找所有周期的开始和结束节点。然后使用循环从端节点到起始节点查找shortest path

G = digraph(A);
e = dfsearch(G, 1, 'edgetodiscovered', 'Restart', true);
n = size(e,1);
result = cell(1,n);
for k = 1:n
    result{k} = shortestpath(G, e(k,2), e(k,1), 'Method', 'unweighted');
end

要避免循环,您可以创建一个虚拟节点,并将节点中的边添加到循环的所有端节点。然后使用shortestpathtree查找从虚拟节点到启动循环节点的最短路径。请注意,结果中的每个路径都以应从路径中删除的虚拟节点开始。

G = digraph(A);
e = dfsearch(G, 1, 'edgetodiscovered', 'Restart', true);
n = size(e,1);
dummy = numnodes(G) + 1;
G = addedge(G, repmat(dummy, n, 1) , e(:,2));
result = shortestpathtree(G, dummy , e(:,1), 'OutputForm', 'cell', 'Method', 'unweighted');