Двудольность графа
Можно ли разбить вершины на две доли без рёбер внутри доли — BFS-раскраской.
1function isBipartite(graph: Map<string, string[]>): boolean {2 const color = new Map<string, 0 | 1>()3 4 for (const start of graph.keys()) {5 if (color.has(start)) continue6 color.set(start, 0)7 8 const queue = [start]9 while (queue.length > 0) {10 const v = queue.shift() as string11 for (const next of graph.get(v) ?? []) {12 if (!color.has(next)) {13 color.set(next, color.get(v) === 0 ? 1 : 0)14 queue.push(next)15 } else if (color.get(next) === color.get(v)) {16 return false // соседи одного цвета — нечётный цикл17 }18 }19 }20 }21 22 return true23}Проблема
Можно ли разбить вершины на две доли без рёбер внутри доли — BFS-раскраской.
Что вы видите
Раскраска в два цвета: соседи получают противоположный; конфликт — нечётный цикл.
Как это работает
Граф двудолен ⇔ нет нечётных циклов. Распределение задач исполнителям, паросочетания, проверка «кто с кем не должен быть в одной группе».
Пошаговый разбор
- 01
Цвет
Стартовая вершина — цвет 0.
- 02
Соседи
Противоположный цвет.
- 03
Конфликт
Соседи одного цвета — нет.
Complexity и ограничения
См. complexity в шапке страницы.
Edge cases
- Пустой вход
Корректно завершается без лишних шагов.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Продукт
Классический приём в реальных системах.
Собеседования
Стандартный вопрос на понимание структуры.
Связанные алгоритмы
«Две команды без внутренних конфликтов»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.