Таким образом, мои последние мысли состоят в том, чтобы делать топологическую сортировку по всему графу всякий раз, когда ребро добавляется или удаляется, и сохраняйте порядок непосредственных дочерних узлов, которые нужно пройти для каждого узла (что может быть немного сложным алгоритмом для записи ).
Затем я сначала выполняю модифицированный поиск в ширину (в соответствии с предложением chaos) и в следующем псевдокоде bfs модифицирую строку:
for each vertex v in Adj[u]
будет:
for each vertex v in OrderedAdj[u]
псевдокод:
BFS(G, s)
for each vertex u in V[G]
color[u] := WHITE
d[u] := infinity
p[u] := u
end for
color[s] := GRAY
d[s] := 0
ENQUEUE(Q, s)
while (Q != Ø)
u := DEQUEUE(Q)
for each vertex v in Adj[u]
if (color[v] = WHITE)
color[v] := GRAY
d[v] := d[u] + 1
p[v] := u
ENQUEUE(Q, v)
else
if (color[v] = GRAY)
...
else
...
end for
color[u] := BLACK
end while
return (d, p)
Я полагаю, что это наиболее оптимальный способ достижения этого, но он включает в себя написание моего собственного алгоритма обхода bfs, плюс сохранение порядка узлов на каждом узле (издержки в памяти, которые я надеялся избежать), и написание моего собственный посетитель dfs для нахождения порядка и его сохранения на узлах на этапе кэширования.
Я удивлен, что не существует никакого способа сделать это, хотя, как мне кажется, довольно распространенный способ навигации по графу дага ...