Направленный граф называется унипатическим, если для любых двух вершин и в графе существует не более одного простого пути из в .
Предположим, мне дан унипатический граф такой, что каждое ребро имеет положительный или отрицательный вес, но не содержит циклов отрицательного веса.
Отсюда я хочу найти алгоритм , который находит все кратчайшие пути ко всем узлам из исходного узла .
Я не уверен, как бы я подошел к решению этой проблемы. Я пытаюсь понять, как я мог бы использовать тот факт, что он не содержит отрицательных циклов веса и, конечно, не более одного простого пути между любыми узлами от до .
algorithms
graphs
Gprime
источник
источник
Ответы:
Выберите представление данных
Сначала посмотрите на размер результата. Вы хотите собрать кратчайшие пути от до каждого другого узла. Если только средняя длина пути не ограничена константой (а это не так: любой список является unipath, и если вы берете корень для общая длина путей равна где равно длина списка), вам нужно быть осторожным в представлении данных: структура, содержащая пути, должна будет использовать совместное использование путей.s n ( n - 1 ) / 2 ns s n(n−1)/2 n
Я предлагаю сохранить результат в массиве, индексированном узлами, пронумерованными от до , с . Каждый элемент в массиве хранит индекс предыдущего узла на пути к этому узлу (например, используйте в качестве специального маркера для узлов, которые недоступны из ). Путь от до будет .| E | - 1 s = 0 - 1 s s t ( s = R [ … R [ t ] … ] , … , R [ R [ t ] ] , R [ t ] , t )0 |E|−1 s=0 −1 s s t (s=R[…R[t]…],…,R[R[t]],R[t],t)
Пройдите по графику
Инициализируйте для всех .- 1R −1
Выполните обход графика в глубину или в ширину, начиная с . Каждый раз, когда достигается узел , задайте его предшественник.u R [ u ]s u R[u]
Поскольку есть циклы, узел может быть достигнут более одного раза. Наличие означает, что уже был посещен.uR[u]≠−1 u
Докажи правильность
Докажите сложность
Алгоритм может достигать каждого узла более одного раза, поэтому не ясно, что его сложность равна . На самом деле проделанная работа где - ребра, которые достижимы из источника. Точнее, мы достигаем узла более одного раза только в одном случае: если узел является первым, которого мы достигаем в определенном цикле, и в этом случае мы достигаем его дважды (один раз с простого пути и один раз после завершения цикла ).Θ ( | E 0 | ) V 0O(|V|) Θ(|E0|) V0
Ну тогда. Докажем, что в унипатическом графе число элементарных циклов растет максимально линейно с числом узлов. (Элементарный цикл - это цикл, который не содержит более короткий цикл.) В следующем обсуждении я предполагаю, что у графа нет собственного ребра (нет ребра от узла к себе; такие ребра в любом случае не имеют значения для построения пути). ).
Унипатические графы могут иметь циклы, но очень ограниченным образом. Было бы неплохо, если бы мы могли как-то связать каждый цикл с отдельным узлом (или, по крайней мере, с максимальным ограниченным числом циклов на узел). Могут ли циклы делить узел? К сожалению, да.
Так что нам нужно больше работать. Что ж, давайте попробуем доказать это индуктивно. Пусть - число узлов в графе , - число ребер, а - количество элементарных циклов, которые не являются само ребрами. Я утверждаю, что если унипатичен и не пуст, то .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)<n G n G 0=#C(G)<#V(G) (a1,…,am)
Это завершает доказательство. Обход следует не более ребер.2|V|−2
источник