Найти отрицательный цикл с ограничениями вершин


11

Для данного графа со взвешенными ребрами, как мы можем найти отрицательный цикл, который содержит хотя бы одну вершину в данном наборе вершин ? Спасибо.{В1,В2,...,ВК}


Этот вопрос довольно неясен. Веса на что, ребра или вершины? Что такое , является ли вершиной или набором вершин? {В1,В2,...,ВК}В1
Исин Цао

@YixinCao Спасибо за замечание, отредактировано: вес по ребрам, - вершина. В1
Тяньи Цуй

Ответы:


8

Если вам не требуется, чтобы цикл был простым, то разбейте (направленный) граф на его сильно связанные компоненты, и для каждого компонента, содержащего одну из заданных вершин , проверьте, содержит ли компонент отрицательный цикл. Если нет компонента, нет отрицательного цикла, содержащего какой-либо V i . Но если какой-то компонент делает это, вы можете найти (непростой) отрицательный цикл, содержащий V i , взяв множество копий отрицательного цикла и добавив к нему пути к некоторой вершине в цикле и к нему из V i . (Общее время нахождения неявного представления желаемого цикла будет таким же, как время нахождения отрицательного цикла в ориентированном графе, например, O (ВяВяВяВя , если я помню.)О(Nм)

Если вам требуется, чтобы цикл был простым, то задача становится NP-полной, даже если задана только одна вершина . (Вы можете свести гамильтонов путь к задаче: чтобы найти гамильтонов путь от заданного источника S к заданному стоку T в данном графе G , укажите вес существующих ребер -1, затем добавьте искусственную вершину V 1 с двумя ребрами стоимость N / 2 - 0,01 каждая, одна от V 1 до S и одна от T до V 1. )В1STграммВ1N/2-0,01В1STВ1

Если вы позволите циклу повторять вершины, но не ребра, я полагаю, что он все еще является NP-полным (аналогичным сокращением, но разбивая каждую вершину на направленное ребро ( v , v ) стандартным способом).v(v,v')


2
Мне нравится этот ответ гораздо лучше, чем мой.
Дэвид Эппштейн

6

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

Сделайте копий набора вершин вашего графа, где n - количество вершин в графе. Замените каждое ребро от u до v в вашем исходном графе ребрами, которые идут от копии i из u до копии i + 1 из v для всех вариантов i . Кроме того, если u принадлежит указанному набору вершин, но не иначе, также включите ребро, которое идет от копии i из u к копии 0 из v .nNUvяUя+1vяUяU0v

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


Если исходный граф имеет вершин и m ребер, то вновь построенный граф будет иметь n 2 вершин и n m ребер. Нахождение отрицательных циклов в нем потребует O ( n 3 м ) времени, которое кажется довольно большим. Я все еще жду лучшего решения, и большое спасибо! NмN2NмО(N3м)
Тяньи Цуй

2
Возможно, более проблематично, циклы, которые он находит, не обязательно будут простыми. Вам нужны простые отрицательные циклы?
Дэвид Эппштейн
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.