Как проверить, имеет ли неориентированный граф цикл нечетной длины - PullRequest
8 голосов
/ 16 ноября 2011

Я пытаюсь найти алгоритм времени O (| V | + | E |), чтобы проверить, имеет ли подключенный неориентированный граф цикл нечетной длины или нет.Сначала найдите на графике и попытайтесь обозначить вершины черными и белыми, чтобы не было смежных двух вершин, помеченных одинаковым цветом.

Есть ли какой-нибудь известный алгоритм для решения этой проблемы за линейное время?

Ответы [ 3 ]

9 голосов
/ 16 ноября 2011

Ваш подход правильный.Вы не можете сделать это лучше.

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

0 голосов
/ 17 марта 2017

При инициализации также необходимо установить Num [s] = 0.

0 голосов
/ 18 февраля 2017

Это также можно сделать с помощью DFS и нумерации вершин.

  1. Часы = 1
  2. Начать с вершины 's', отметить ее как "посещенную" и вызвать "Исследовать"(s)

Исследуйте (u)

  1. , если вы уже "посетили", то если(clock-Num [u]) нечетный, то есть нечетный цикл,

    еще пометьте 'u' как "посещенный"

  2. Num [u] =clock ++;

  3. для всех соседних узлов v из u

      i) Explore(v)
      ii) clock=Num[u]
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...