Если у вас есть стандартная функция поиска по графику, скажем, Graph.shortest(from, to)
в библиотеке, вы можете зациклить и свернуть в C # / псевдокод:
[ (fst.shortest(A, C) + nxt.shortest(C, B))
for C in nodes , (fst, nxt) in [(up, down), (down, up)] ].reduce(min)
Если вам нужно запомнить минимальные пути / пути, и так получилось, что ваша стандартная функция возвращает вам данные, вы также можете произнести
[ [fst, nxt, C, fst.shortest(A, C), nxt.shortest(C,B)]
for C in nodes , (fst, nxt) in [(up, down), (down, up)] ].reduce(myMin)
, где myMin
должен сравнить два [fst, nxt, C, AC, BD]
кортежа и оставить тот, который имеет меньшее расстояние, или оба, и при условии, что reduce
- умная функция.
Это имеет некоторые накладные расходы памяти, если наши графики большие и вообще не используют память (что возможно, если они генерируются динамически), но на самом деле никаких накладных расходов на скорость, imho.