Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 27.09.2006 | Доступ: свободный | Студентов: 3534 / 125 | Оценка: 4.44 / 4.11 | Длительность: 13:45:00
Специальности: Программист, Математик
Лекция 3:

Важнейшие классы графов

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >

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

Граф называется двудольным, если множество его вершин можно так разбить на два подмножества, чтобы концы каждого ребра принадлежали разным подмножествам. Эти подмножества называются долями. Таким образом, каждая из долей порождает пустой подграф. Примером двудольного графа является простая цепь P_{n} при любом n: одна доля порождается вершинами с четными номерами, другая - с нечетными. Граф K_{3} - пример графа, не являющегося двудольным: при любом разбиении множества его вершин на два подмножества в одном из этих подмножеств окажутся две смежных вершины.

Прикладное значение понятия двудольного графа связано с тем, что с помощью таких графов моделируются отношения между объектами двух типов, а такие отношения часто встречаются на практике (например, отношение "продукт x используется в производстве изделия y " между исходными продуктами и готовыми изделиями, или "работник x владеет профессией y " между работниками и профессиями). В математике такие отношения тоже нередки, один из наиболее распространенных их видов - отношения инцидентности. Пусть A - множество, а B - семейство его подмножеств. Элемент x\in A и множество X\in B инцидентны друг другу, если x\in X. Отношение инцидентности можно описать с помощью двудольного графа G, в котором VG=A\cup
B, EG=\{(x,X)|{x\in A}, X\in B, x\in X\}. На рис. 3.3 показан граф отношения инцидентности для A=\{a,b,c\}, B=\{B_{1},B_{2},B_{3},B_{4}\}, где B_{1}=\{a\}, B_{2} =\{a,b,c\}, B_{3}
=\{b,c\}, B_{4} = \varnothing.


Рис. 3.3.

Вообще говоря, разбиение множества вершин двудольного графа на доли можно осуществить не единственным способом. Так, в графе из только что приведенного примера можно взять в качестве долей множества \{a,b,c,B_{4}\} и \{B_{1},B_{2},B_{3}\}. В то же время в самом определении этого графа уже заложено "естественное" разбиение на доли A и B. Двудольные графы, возникающие в приложениях, нередко бывают заданы именно так - с множеством вершин, изначально состоящим из двух частей, и с множеством ребер, каждое из которых соединяет вершины из разных частей.

Если разбиение на доли не задано, то может возникнуть вопрос, существует ли оно вообще, т.е. является ли данный граф двудольным? Если в графе n вершин, то имеется 2^{n-1} разбиений множества вершин на два подмножества и непосредственная проверка всех этих разбиений будет очень трудоемким делом. Следующая теорема дает критерий двудольности, а из ее доказательства можно извлечь и эффективный алгоритм проверки двудольности. Подробно такой алгоритм будет описан в "Поиск в ширину" .

Теорема 5. Следующие утверждения для графа G равносильны:

  • (1) G - двудольный граф;
  • (2) в G нет циклов нечетной длины;
  • (3) в G нет простых циклов нечетной длины.

Доказательство.

Докажем, что из (1) следует (2). Пусть G - двудольный граф, в котором выбрано некоторое разбиение на доли, C=x_{1},x_{2}\ldots x_{k},x_{1} - цикл длины k в графе G. При любом i=1\ldots k-1 вершины x_{i} и x_{i+1} смежны и, следовательно, принадлежат разным долям. Таким образом, одна доля состоит из всех вершин с нечетными индексами, т.е. x_{1},x_{3},\ldots, другая - из всех вершин с четными индексами. Но вершины x_{k} и x_{1} тоже смежны и должны принадлежать разным долям. Следовательно, k - четное число.

Очевидно, что из (2) следует (3); остается доказать, что из (3) следует (1). Рассмотрим граф G, в котором нет простых циклов нечетной длины. Ясно, что граф, в котором каждая компонента связности - двудольный граф, сам двудольный. Поэтому можно считать, что граф G связен. Зафиксируем в нем некоторую вершину a и докажем, что для любых двух смежных между собой вершин x и y имеет место равенство |d(a,x)-d(a,y)|=1. Действительно, допустим сначала, что d(a,x)=d(a,y)=t. Пусть x_{1},x_{2}\ldots x_{t} - кратчайший путь из a в x, y_{1},y_{2}\ldots y_{t} - кратчайший путь из a в y. Эти пути начинаются в одной вершине: x_{1} = y_{1} = a, а оканчиваются в разных: x_{t}=x, y_{t} =y. Поэтому найдется такое k, что x_{k}=y_{k} и x_{i} \ne y_{i} при всех i\gt k. Но тогда последовательность x_{k},x_{k+1} \ldots x_{t},y_{t}\ldots
y_{k+1},y_{k} является простым циклом длины 2(t-k)+1. Следовательно, d(a,x)\ne d(a,y). Предположим, что d(a,x)< d(a,y). Если x_{1},x_{2}\ldots x_{t} - кратчайший путь из a в x, то, очевидно, что x_{1},x_{2}\ldots x_{t},y - кратчайший путь из a в y, следовательно, d(a,y)=d(a,x)+1. Итак, расстояния от двух смежных вершин до вершины a различаются ровно на единицу. Поэтому, если обозначить через A множество всех вершин графа, расстояние от которых до вершины a четно, а через B множество всех вершин с нечетными расстояниями до a, то для каждого ребра графа один из его концов принадлежит множеству A, другой - множеству B. Следовательно, граф G - двудольный.

Пусть C - цикл в графе G. Множество вершин цикла C порождает в G подграф, который содержит все ребра этого цикла, но может содержать и ребра, ему не принадлежащие. Такие ребра называют хордами цикла C. Простой цикл, не имеющий хорд, - это порожденный простой цикл. В графе, изображенном на рис. 3.4, хордами цикла 4,1,2,6,5,4 являются ребра (1,5), (1,6) и (2,5), а цикл 2,3,7,6,2 - порожденный простой цикл. Заметим, что любой цикл длины 3 является порожденным простым циклом.


Рис. 3.4.

Рис. 3.5.

Пусть C - простой цикл длины k в некотором графе, (x,y) - хорда этого цикла. Ребро (x,y) вместе с ребрами цикла C образует два цикла меньшей длины, C_{1} и C_{2} (см. рис. 3.5), сумма длин которых равна k+2.

Значит, если C - цикл нечетной длины, то один из циклов C_{1}, C_{2} тоже имеет нечетную длину. Отсюда следует, что в графе, в котором есть цикл нечетной длины, имеется и порожденный простой цикл нечетной длины. Поэтому критерий двудольности справедлив и в следующей формулировке.

Следствие.Граф является двудольным тогда и только тогда, когда в нем нет порожденных простых циклов нечетной длины.

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >
Петр Петров
Петр Петров

произведение графов К(2)*О(4) фактически 4 отдельных графа К(2)?

Александр Лаврентьев
Александр Лаврентьев

много инструкций вида if - then - else

Например Procedure DFS(a) опишите каким образом следует понимать вложенность инструкций. Как в языке С ? 

т.е. следующее 

if (...) then (...)

if (...) then (...)

else(...)

 

раскрывается как 

if (...) then (...)

if (...) then (...)

         else(...)

или так :

if (...) then

 {  (...)

     if (...) then (...)

              else(...)

}

обьясните пожалуйста.

 

 

Дарья Волонтович
Дарья Волонтович
Россия, г. Хабаровск