Как найти, является ли граф двудольным?

Я пытался понять двудольный граф. Насколько я понимаю, это граф G, который можно разделить на два подграфа U и V. Итак, пересечение U и V является нулевым множеством, а объединение - графом G. Я пытаюсь найти, если граф двудольный или не использует BFS. Тем не менее мне непонятно, как мы можем найти это с помощью BFS.

Скажем, мы имеем график, определенный ниже.

a:e,f
b:e
c:e,f,h
d:g,h
e:a,b,c
f:a,c,g
g:f,d
h:c,d

Что мне нужно здесь, это пошаговое объяснение того, как этот граф является двудольным или не использует BFS.

Ответ 1

Взято из GeeksforGeeks

Ниже приведен простой алгоритм, чтобы выяснить, является ли данный граф Birpartite или нет с использованием Breadth First Search (BFS): -

  • Назначить цвет RED исходной вершине (помещая в набор U).
  • Цвет всех соседей со СИНЯМ цветом (ввод в набор V).
  • Цвет соседей соседей со красным цветом (помещая в набор U).
  • Таким образом, назначьте цвет всем вершинам таким образом, чтобы он удовлетворял всем ограничениям проблемы раскраски m-типа, где m = 2.
  • При назначении цветов, если мы найдем сосед, который окрашен в тот же цвет, что и текущая вершина, тогда граф не может быть окрашен двумя вершинами (или граф не является двудольным).

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

Кроме того, ПРИМЕЧАНИЕ: -

- > Можно окрасить график цикла четным циклом, используя два цвета.

- > Невозможно покрасить график циклов с нечетным циклом, используя два цвета.

РЕДАКТИРОВАТЬ: -

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

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

И график будет называться двудольным, ЕСЛИ И ТОЛЬКО ЕСЛИ, каждая из его подключенных компонентов оказывается двудольной.

Ответ 2

Из Университета Карнеги-Меллона:

"Напомним, что граф G = (V, E) называется двудольным если его вершинное множество V можно разбить на два непересекающихся множества V1, V2 таких, что все ребра в E. имеют одну конечную точку в V1 и одну конечную точку в V2.

(источник: http://www.cs.cmu.edu/~15251/homework/hw5.pdf)

Вы уверены, что вам нужно использовать BFS? Определение, если граф, если двудольный требует определения длины цикла, и DFS, вероятно, лучше для обнаружения цикла, чем BFS.

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

Ответ 3

Вот решение Prolog CLP (FD). Просто моделируйте каждое ребро в графе как переменную в домене 0..1. Затем смоделируйте каждую вершину как уравнение:

X #\= Y.

Затем произведите маркировку. Если маркировка находит решение, все готово. Однако он может найти множество решений. Вот пример для вашего примера:

Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.23)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam

:- use_module(library(clpfd)).
problem(L) :- L=[A,B,C,D,E,F,G],
    A #\= E, A #\= F,
    B #\= E,
    C #\= E, C #\= F, C #\= H,
    D #\= G, D #\= H,
    E #\= A, E #\= B, E #\= C,
    F #\= A, F #\= C, F #\= G,
    G #\= F, G #\= D,
    H #\= C, H #\= D.

?- problem(L), L ins 0..1, label(L).
L = [0, 0, 0, 1, 1, 1, 0] ;
L = [1, 1, 1, 0, 0, 0, 1].

Работает также в GNU Prolog, SICStus Prolog, Jekejeke Minlog и т.д., в основном с любой системой Prolog, которая реализует CLP (FD). Альтернативно также можно использовать CLP (B) или dif/2.

Ответ 4

Ниже приведен подход BFS, чтобы проверить, является ли граф двудольным.

  • c = 0
  • выберите node x и установите x.class = c
  • пусть ys - узлы, полученные BFS
    • c = 1-c
    • для y в ys установить y.class = c
    • если какой-либо y в ys имеет соседний z с z.class == c, тогда граф не является двудольным
    • повторять до тех пор, пока не будет найдено больше узлов
  • граф двудольный

Это предполагает, что граф представляет собой единую компоненту связи - если это не так, просто выполните эту процедуру для каждого компонента.

Ответ 5

Создайте дерево bfs. Если между вершинами одинакового уровня дерева есть ребра. Тогда граф не двудольный, а другой - двудольный.

Ответ 6

Сделайте это более простым способом.

Запустите сильно связанный компонентный алгоритм.

Если какой-либо node полученного метрата имеет более двух вершин, то данный граф не двудольный.