Существует ли путь через все вершины ориентированного графа?

Для заданного ориентированного графа G существует ли путь (не обязательно простой путь), который проходит через все вершины графа G?

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

Пока я понял, что для сильно связного графа всегда есть путь. Для ациклического графа, если имеется более одного источника, путь никогда не будет существовать. Кроме того, если есть вершина, для которой D out больше 1, путь никогда не будет существовать.

Проблема в том, что я не уверен, что последнее верно, а если оно неверно, то мой алгоритм неверен.


person Nusha    schedule 17.04.2012    source источник
comment
Вы спрашиваете, как решить проблему? Или, если последнее предположение верно [подсказка: это не так, например E = {(v_i,v_j) | i < j }, есть вершины такие, что d_out(v)>1, и еще есть путь, который проходит через все вершины - даже гамильтонов на самом деле]   -  person amit    schedule 17.04.2012
comment
Да, я не был уверен в последнем, и вы это подтвердили.. Так что мне нужна помощь сейчас   -  person Nusha    schedule 17.04.2012


Ответы (1)


Последнее предположение неверно. Например, взгляните на график G = (V,E), где E = {(v_i,v_j) | i < j } График явно является DAG. поэтому нахождение максимальной компоненты сильной связи не изменит граф. Кроме того, граф имеет гамильтонов путь, однако d_out(v_1) > 1 [при условии |V| > 3].

Однако - вы на правильном пути.

Алгоритм в псевдокоде высокого уровня:

  1. найти максимальные сильно связанные компоненты в графе - результирующий граф является DAG.
  2. Используйте топологическую сортировку полученного графа1.
  3. Проверьте, создает ли упорядоченная сортировка гамильтонов путь
  4. если да - верни true, иначе верни false

Претензия:

Путь со всеми вершинами существует тогда и только тогда, когда DAG, представляющий MSCC графа, имеет гамильтонов путь.

Доказательство утверждения:
‹-
если есть гамильтонов путь - то такой путь тривиален, для каждого MSCC - путь проходит через все вершины , а затем к внешнему ребру, которое представляет наше ребро, выбранное на гамильтоновом пути в графе MSCC.
->
Если такой путь существует, пусть он будет v0->v1->...vm.
Обозначим через V_i максимальную сильно связную компоненту, в которой лежит v_i.
Теперь для пути в исходном графе v0->v1->...->vm есть также путь в графе MSCC2: V_0->V_1->...->V_m.
Обратите внимание, что если V_i появляется дважды [или более] в указанном выше пути - два вхождения являются смежными друг с другом, в противном случае найденный MSCC не будет максимальным, потому что если V_i->V_k->...->V_i допустимый путь - тогда V_i и V_k не максимальны, так как вы можете объединить их в один большой SCC.
Теперь для каждого V_i объедините все его вхождения в одно, и вы получите путь, где каждый V_i появляется не более одного раза [мы только что показали, почему], и ровно один [поскольку каждый v_i был на исходном пути и мы не удаляли полностью MSCC - просто свернули их].
Таким образом, сгенерированный путь является гамильтоновым путем в графе MSCC.

Доказательство правильности предложенного алгоритма:
Поскольку мы показали, что гамильтонов путь в графе MSCC существует тогда и только тогда, когда запрошенный путь существует в исходном графе, то:
- >
Алгоритм вернул true -> Алгоритм нашел гамильтонов путь в DAG -> В DAG есть гамильтонов путь [сноска 1] -> Имеется путь, как запрошено в оригинале график.
‹-
Алгоритм вернул false -> Алгоритм не нашел гамильтонов путь в DAG -> В DAG нет гамильтонова пути [сноска 1] -> В исходном пути нет запрошенного пути.

QED


1: в DAG есть уникальная топологическая сортировка, если существует гамильтонов путь, а если есть гамильтонов путь - это порядок вершин в топологической сортировке. Таким образом, в DAG найти гамильтонов путь несложно.
2: На самом деле, это небольшая модификация, V_i->V_i на самом деле не является ребром на графике MSCC, но пока давайте обозначим его как единицу.

person amit    schedule 17.04.2012
comment
Спасибо за ваш ответ ... Но разве путь Гамильтона не обязательно простой путь ?? - person Nusha; 17.04.2012
comment
@Nusha: Это так, но я утверждаю, что в DAG есть гамильтонов путь, представляющий MSCC графа, а не сам граф. гамильтонов путь в графе MSCC подразумевает путь со всеми вершинами исходного графа. - person amit; 17.04.2012
comment
@Nusha: я добавил более подробное объяснение [и доказательство], почему алгоритм верен. - person amit; 17.04.2012