Чтобы проверить, является ли график двудольным, вы можете проверить, является ли он 2-окрашиваемым (эквивалентным).
Решение этой проблемы можно найти здесь . Я скопировал основные шаги, приведенные ниже, на случай, если ссылка перестает работать.
Покрасьте любую из ваших вершин красным.
Определите все неокрашенные вершины, смежные с красной вершиной. Раскрасьте их в синий цвет.
Определите все неокрашенные вершины, которые примыкают к синей вершине. Раскрасьте их в красный цвет.
Повторите шаги 2 и 3, пока все вершины не станут красными или синими.
Если есть две смежные вершины одного цвета, то ваш граф не двудольный, иначе он двудольный.
Если граф двудольный, алгоритм раскраски создаст два требуемых набора точек (одна красная и один синий).
Этот алгоритм не является оптимальным, так как он не работает в линейном времени. У вас может быть алгоритм линейного времени (O(E)
с E
количеством ребер в графе), жадно раскрашивая вершины вашего графа в DFS или BFS.