2021/01/05 – В предыдущем примере кода C# алгоритм был реализован неправильно. На его место была добавлена исправленная реализация Java.
Если вы не знакомы с графиками, ознакомьтесь с некоторыми из моих предыдущих сообщений о них.
Ресурсы:
Еда на вынос:
- Двудольный граф (биография) – это граф, вершины которого можно разделить на два непересекающихся, независимых множества
uиv. Каждое ребро будет соединять вершину из одного набора с другим (без самосоединяющихся ребер – т.Е. ребер, идущих из вершины вuв другую вершину вu). - Один из способов визуализации двудольного графа – это покрасить все вершины в наборе в один и тот же цвет. Набор
uможет быть красными вершинами, тогда какvможет быть черным. Это означало бы, что ребро всегда будет состоять из пары красных и черных вершин. - Этот тип двухцветности невозможен в недвойственных графах. Представьте себе график с тремя вершинами, расположенными в треугольнике. Мы не можем представить этот график в виде двух независимых наборов, и мы не можем раскрасить его таким образом, чтобы каждое ребро имело разные конечные точки.
- Один из способов, которым мы можем проверить, является ли граф двудольным, – это выполнить поиск по глубине (DFS) по вершинам. Нанесение двух цветов на график.
- Начните со случайной вершины
vи раскрасьте его в цвет 1 (красный, например). - Раскрасьте все соседние вершины
uпротивоположным цветомv. Для каждого соседнегоuтакже рекурсивно вызовите нашу процедуру DFS. - Если граф двудольный, мы можем завершить это двухцветие без противоречия.
- Если граф не двудольный, то в какой-то момент вершина получит оба цвета – и это противоречие означает, что мы не можем добиться двухцветности графика.
- Начните со случайной вершины
- Временная сложность равна
O(v + e)для списка смежности. Сложность пространства равнаO(v). Для матрицы смежности сложность времени и пространства будетO(v^2).
Неориентированный график, который может быть двухцветным:
Неориентированный график, который не может быть двухцветным:
Ниже приведены реализации для проверки того, являются ли неориентированные графики двудольными. Существуют решения как для неориентированного списка смежности, так и для представления матриц смежности графов:
Как всегда, если вы обнаружили какие-либо ошибки в этом посте, пожалуйста, дайте мне знать!
Оригинал: “https://dev.to/jjb/part-21-checking-if-an-undirected-graph-is-bipartite-2n2d”