Найти кратчайшие пути в взвешенном унипатическом графе

12

Направленный граф называется унипатическим, если для любых двух вершин и в графе существует не более одного простого пути из в .uvG=(V,E)uv

Предположим, мне дан унипатический граф такой, что каждое ребро имеет положительный или отрицательный вес, но не содержит циклов отрицательного веса.G

Отсюда я хочу найти алгоритм , который находит все кратчайшие пути ко всем узлам из исходного узла .O(|V|)s

Я не уверен, как бы я подошел к решению этой проблемы. Я пытаюсь понять, как я мог бы использовать тот факт, что он не содержит отрицательных циклов веса и, конечно, не более одного простого пути между любыми узлами от до .uv

Gprime
источник
1
что ты уже испробовал? Если вы полностью застряли, начните с малого: как на самом деле выглядят унипатические графики? Например, нарисуйте каждый унипатический граф с одной вершиной, двумя вершинами, тремя вершинами и т. Д. Вы можете заметить полезную модель. Кроме того, вы упоминаете, что нет отрицательных циклов веса - могут ли быть циклы (любого веса)?
Юхо
@mrm О каком шаблоне ты думаешь? У унипатических графов могут быть циклы в ограниченном виде, что я не могу найти простой способ выразить.
Жиль "ТАК - перестань быть злым"
@ mrm Нет. Ребро может принадлежать не более одного цикла. Узел может принадлежать любому числу циклов: точечный граф в форме звезды является унипатическим (и вы можете получить еще более высокое соотношение элементарных циклов на узел). E = i n { ( a , b i ) , ( b i , a ) }nE=in{(a,bi),(bi,a)}
Жиль "ТАК ... перестать быть злым"

Ответы:

10

Выберите представление данных

Сначала посмотрите на размер результата. Вы хотите собрать кратчайшие пути от до каждого другого узла. Если только средняя длина пути не ограничена константой (а это не так: любой список является unipath, и если вы берете корень для общая длина путей равна где равно длина списка), вам нужно быть осторожным в представлении данных: структура, содержащая пути, должна будет использовать совместное использование путей.s n ( n - 1 ) / 2 nssn(n1)/2n

За исключением циклов, существует один путь от до любого другого узла . Если этот путь проходит через промежуточный узел , то первый сегмент пути - это требуемый путь от до . U T S Tsutst

Я предлагаю сохранить результат в массиве, индексированном узлами, пронумерованными от до , с . Каждый элемент в массиве хранит индекс предыдущего узла на пути к этому узлу (например, используйте в качестве специального маркера для узлов, которые недоступны из ). Путь от до будет .| E | - 1 s = 0 - 1 s s t ( s = R [ R [ t ] ] , , R [ R [ t ] ] , R [ t ] , t )0|E|1s=01sst(s=R[R[t]],,R[R[t]],R[t],t)

Пройдите по графику

Инициализируйте для всех .- 1R1

Выполните обход графика в глубину или в ширину, начиная с . Каждый раз, когда достигается узел , задайте его предшественник.u R [ u ]suR[u]

Поскольку есть циклы, узел может быть достигнут более одного раза. Наличие означает, что уже был посещен.uR[u]1u

Докажи правильность

Из-за unipathic свойства не имеет значения, как мы достигаем каждого узла, пока мы не завершили цикл. Есть только один простой путь.

Докажите сложность

Алгоритм может достигать каждого узла более одного раза, поэтому не ясно, что его сложность равна . На самом деле проделанная работа где - ребра, которые достижимы из источника. Точнее, мы достигаем узла более одного раза только в одном случае: если узел является первым, которого мы достигаем в определенном цикле, и в этом случае мы достигаем его дважды (один раз с простого пути и один раз после завершения цикла ).Θ ( | E 0 | ) V 0O(|V|)Θ(|E0|)V0

Ну тогда. Докажем, что в унипатическом графе число элементарных циклов растет максимально линейно с числом узлов. (Элементарный цикл - это цикл, который не содержит более короткий цикл.) В следующем обсуждении я предполагаю, что у графа нет собственного ребра (нет ребра от узла к себе; такие ребра в любом случае не имеют значения для построения пути). ).

Унипатические графы могут иметь циклы, но очень ограниченным образом. Было бы неплохо, если бы мы могли как-то связать каждый цикл с отдельным узлом (или, по крайней мере, с максимальным ограниченным числом циклов на узел). Могут ли циклы делить узел? К сожалению, да.

Вы можете иметь циклов, все совместно использующих один узел и никаких других узлов. Результирующий граф унипатичен. С циклами длины 2 это шаблон звезды с центральным узлом и любым числом узлов таких что .a a b ii , a b imaabii,abi

Так что нам нужно больше работать. Что ж, давайте попробуем доказать это индуктивно. Пусть - число узлов в графе , - число ребер, а - количество элементарных циклов, которые не являются само ребрами. Я утверждаю, что если унипатичен и не пуст, то .G # E ( G ) # C ( G ) G # C ( G ) # V ( G ) - 1#V(G)G#E(G)#C(G)G#C(G)#V(G)1

Для графа с одним или двумя узлами это очевидно. Предположим, что утверждение верно для всех графов, таких что и пусть - унипатический граф с узлами. Если не имеет цикла, , дело закрыто. В противном случае, пусть будет элементарный цикл.G n G 0 = # C ( G ) < # V ( G ) ( a 1 , , a m )#V(G)<nGnG0=#C(G)<#V(G)(a1,,am)

Сверните цикл: пусть будет графом, узлы которого являются узлами минус плюс узел а ребра которого являются всеми ребрами не включая , плюс всякий раз, когда и всякий раз, когда . Каждый путь в индуцирует путь в (если путь включает в себя , то замените его наGG{a1,,am}aGaiaGbi,aiGbbGai,bGaiGGbacbaiai+1ajc в ). Следовательно, унипатичен. Кроме того, поскольку циклы в не имеют общих ребер, в есть все циклы в кроме исключенного нами: . По индукции . Поскольку , имеем .GGGGG#C(G)=#C(G)1#C(G)#V(G)1#V(G)=#V(G)m+1#C(G)=#C(G)+1#V(G)m=nmn1

Это завершает доказательство. Обход следует не более ребер.2|V|2

Жиль "ТАК - прекрати быть злым"
источник