Я знаю, что проблема проверки того, принадлежит ли данное ребро взвешенного орграфа отрицательному циклу, является NP-полной (Поиск минимального подграфа, содержащего все отрицательные циклы), а Беллман-Форд позволяет проверить вершину на предмет того же самого за время O(|V|*|E|). Но что, если я хочу найти все вершины, принадлежащие отрицательным циклам? Интересно, можно ли это сделать быстрее, чем O(|V|^3) Флойда-Уоршалла.
Нахождение всех вершин на отрицательных циклах
Ответы (1)
Я не думаю, что Флойд-Уоршалл справляется с поиском этих вершин. Используя аналогичный подход, использованный в сообщении, на которое вы ссылаетесь, можно показать, что нахождение множества всех вершин, лежащих на отрицательном цикле, также является NP-полным.
В соответствующем посте показано, что можно использовать алгоритм для поиска набора всех ребер, лежащих на отрицательном цикле, для решения проблемы гамильтонового цикла, что означает, что предыдущая проблема является NP-полной. Если мы можем свести задачу нахождения всех ребер, лежащих на отрицательном цикле, к проблеме нахождения множества всех вершин, лежащих на отрицательном цикле, мы показали NP-полноту последней проблемы.
Для каждого ребра (u, w) вашего взвешенного орграфа введите новую вспомогательную вершину v и разделите (u, w) на два ребра (u, v) и (v, w). Вес (u, w) может быть присвоен либо (u, v), либо (v, w). Теперь применим волшебный полиномиальный алгоритм, чтобы найти все вершины, лежащие в отрицательном цикле, и взять подмножество, состоящее из вспомогательных вершин. Поскольку каждая вспомогательная вершина связана с ребром, мы решили задачу поиска минимального подграфа, содержащего все отрицательные циклы, и, таким образом, можем также решить проблему гамильтоновых циклов за полиномиальное время, что подразумевает P = NP. Предполагая, что P != NP, нахождение всех вершин, лежащих на отрицательном цикле, является NP-полным.