假设有向图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>
谢谢。
答案 0 :(得分:0)
您可以使用dfsearch
和edgetodiscovered
选项查找所有周期的开始和结束节点。然后使用循环从端节点到起始节点查找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');