Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Двудольные графы Теория графов

В этом уроке мы разберем еще один тип графа — двудольный. Узнаем, что это за граф, и как его определить.

Что такое двудольный граф

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

Так выглядят двудольные графы:

eyJpZCI6ImY1ZGJmNDMzNTk1OWM0MmM3MzY1YTE4N2I2OTg2MTQ1LnBuZyIsInN0b3JhZ2UiOiJjYWNoZSJ9?signature=f7704f05ec3fc6567086370133258a03fdaceb8a52c072db3764dcd82bfb2a25

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

Обычно двудольные графы рисуют так, чтобы множество располагалось сверху, а множество — снизу. Несмотря на это, не все двудольные графы рисуются именно так. Например, ниже показаны двудольные сетки:

eyJpZCI6IjJiYTg3ZDVmNWIxMGViMWMxNGZiZWZjNjk2YmExZDVjLnBuZyIsInN0b3JhZ2UiOiJjYWNoZSJ9?signature=d8454db5192d0315d8e2855f7dde09e590993b218095b36291753b31ed4944e8

Как определить, что граф двудольный

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

Если получится, что у двух соседних вершин одинаковые метки или какая-то вершина окажется помеченной и , и , значит, граф — не двудольный. Если это не произошло, граф — двудольный. Пример показан ниже:

eyJpZCI6IjE2MDA2YmE5MDFkM2MxY2VmNGFjNzg1YmJjMDYxM2Q0LnBuZyIsInN0b3JhZ2UiOiJjYWNoZSJ9?signature=cd270bff7f7d59c1f082dd364508227cc02dd835e0fbad30f292b67a7b2c658d

Предположим, мы попробуем алгоритм на треугольнике . Начнем с того, что обозначим вершину . Затем две соседние вершины обозначим . Далее появляется проблема, так как эти вершины — смежные. Аналогичная проблема возникает и :

eyJpZCI6IjQyNzA3NTIxZGRiYzU2OGYzOGViYzZmMjNkNGM4MDg1LnBuZyIsInN0b3JhZ2UiOiJjYWNoZSJ9?signature=015ff74940d960ee43b50bbd82de439daf3efe98206c0b9e889effc76e939a3f

Такое происходит только с нечетными циклами, поэтому у двудольных графов их не бывает. Нечетные циклы — это единственное, чего не может быть у двудольных графов. Докажем это.

Как доказать теорему о двудольных графах

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

Предположим, мы начинаем трассировку с вершины . Тогда вторая, четвертая, шестая и следующие четные вершины находятся в , а остальные — в . Когда мы вернемся в начальную вершину, пройдем четное количество шагов. Это значит, что у цикла четная длина:

eyJpZCI6ImU1YTA0Njg1Nzg5NTI2YjI0MzZiNzMxYTgxNGViN2U2LnBuZyIsInN0b3JhZ2UiOiJjYWNoZSJ9?signature=c18abb89e4e98026c7833f7f477f3561b74af8fa37976ac0d36a16fa22975db4

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

Мы утверждаем, что это образует двудольное разбиение компоненты. Для этого покажем, что нет ребер ни внутри , ни внутри .

Предположим, что существует такое ребро между вершинами и , которые находятся в или в . Значит, и находятся либо на четном расстоянии от , либо на нечетном.

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

Его длина — это сумма слагаемых:

  • Расстояние от до

  • Расстояние от до

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

Пример нечетного цикла, который создали во второй части доказательства:

eyJpZCI6ImEzZDYxMGJhNmYzMTE2ZjZlMjA1M2YzZmEyNjNmMGI1LnBuZyIsInN0b3JhZ2UiOiJjYWNoZSJ9?signature=7e7d3bbcbad34f970ce6c3eb4f0556163c41bd3b1954db24481af472c183d7b2

Теперь нужно выбрать вершину и разбить граф на две группы:

  • Вершины, которые находятся на четном расстоянии от выбранной вершины

  • Вершины, которые находятся на нечетном расстоянии от выбранной вершины

Это основная идея доказательства. Во многих теоремах в теории графов есть одна большая идея, вокруг которой вращается доказательство.

Что такое полный двудольный граф

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

eyJpZCI6ImY3YWJkMTliMjdiYzIzMGUxYjBlYmVjMTk1MDUyZWY0LnBuZyIsInN0b3JhZ2UiOiJjYWNoZSJ9?signature=5954e77c108cb34973d09d8a22c8a56cbe7ab8b87ebda2d2b87319e2f73862e9

Мы разобрали, что такое двудольные графы и как они выглядят. Теперь вы знаете, как провести доказательство того, что граф двудольный и какие его свойства указывают на это.


Самостоятельная работа

Задача №1

Является ли следующий граф двудольным?

eyJpZCI6IjQ2YmI4NWIyOWQ3ZDRjMzEwZDYwOTI1Y2I4ODBiZjY3LnBuZyIsInN0b3JhZ2UiOiJjYWNoZSJ9?signature=2aa465b2211058d9329d3417255afb4610ee909769cd871484430e7e21f4ffbd
Нажмите, чтобы увидеть ответ

Этот граф можно перерисовать в таком виде:

eyJpZCI6IjE1NTIyZmEwZDdhN2IwOWM2ODFjMmMyZjgyZWNiMDMxLnBuZyIsInN0b3JhZ2UiOiJjYWNoZSJ9?signature=bde9c848a08ab25891233fad4981e1a1edeb65a8ea4278f4e6a5d96e0307be4e

Этот граф состоит из двух наборов вершин:

Вершины множества соединяются только с вершинами множества и наоборот. Кроме того, любые две вершины внутри одного множества не соединяются. Это удовлетворяет определению двудольного графа.

Следовательно, этот граф является двудольным.

Задача №2

Чему равно максимальное количество ребер в двудольном графе на вершинах?

Нажмите, чтобы увидеть ответ

Известно, что максимально возможное число ребер в двудольном графе на ' ' вершин = .

Подставим . Посчитаем максимальное количество ребер в двудольном графе на вершинах:

Следовательно, максимальное количество ребер в двудольном графе на вершинах .


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Изображение Тото

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