Вы ищете поиск в ширину , чтобы найти кратчайший путь на вашем графике. Не касаясь данных каким-либо образом, вы можете сделать это за O (n) время на узел, учитывая древовидную структуру вашего графика:
nodedest = [1 1 2 3 6 2];
hopcount = zeros(1, 6);
for n = 2:6
k = n
while k ~= 1
hopcount(n) = hopcount(n) + 1
k = nodedest(k)
end
end
Если вы желаете изменить смысл своих ребер (вводя отношение «один ко многим»), вы можете выполнить то же самое за один проход, сократив весь алгоритм с O (n 2 ) к O (n) временной сложности. Компромисс будет в том, что сложность памяти увеличится с O (1) до O (n):
nodedest = [1 1 2 3 6 2];
% Reverse the input
nodesource = cell(1, 6);
nodesource(:) = {[]}
for n = 2:6
k = nodedest(n);
nodesource{k} = [nodesource{k} n];
end
% implement bfs, using the assumption that the graph is a simple tree
hopcount = zeros(1, 6);
cache = [1];
hops = 0;
while ~isempty(cache)
next = []
for c = cache
hopcount(c) = hops;
next = [next nodesource(c)]
end
hops = hops + 1;
cache = next
end