Вы можете использовать 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');