Задача 2. Поиск в ширину
Рассмотрим метод поиска в графе, называемый поиском в ширину (англ: breadth first search). Прежде чем описать его, отметим, что при поиске в глубину чем позднее будет посещена вершина, тем раньше она будет использована — точнее, так будет при допущении, что вторая вершина посещается перед использованием первой. Это прямое следствие того факта, что просмотренные, но еще не использованные вершины скапливаются в стеке. Поиск в ширину, грубо говоря, основывается на замене стека очередью. После такой модификации, чем раньше посещается вершина (помещается в очередь), тем раньше она используется (удаляется из очереди). Использование вершины происходит с помощью просмотра сразу всех еще не просмотренных соседей этой вершины. Вся процедура поиска представлена ниже (данная процедура используется также и для просмотра графа, и в псевдокоде, описанном ниже, отсутствуют операторы, которые не используются для поиска).
1 procedure WS (v);
(*поиск в ширину в графе с началом в вершине v;
переменные НОВЫЙ, ЗАПИСЬ — глобальные *)
2 begin
3 ОЧЕРЕДЬ := ; ОЧЕРЕДЬ <= v; НОВЫЙ [v] := ложь
4 while ОЧЕРЕДЬ do
5 begin р<= ОЧЕРЕДЬ; посетить р;
6 for u ЗАПИСЬ [р] do
7 if НОВЫЙ [u] then
8 begin ОЧЕРЕДЬ <= u; НОВЫЙ [u]:=ложь
9 end
10 end
end
На рис. 1 представлен граф, вершины которого занумерованы согласно очередности, в которой они посещаются в процессе поиска в глубину.
Как и в случае поиска в глубину, процедуру WS можно использовать без всяких модификаций и тогда, когда списки инцидентности ЗАПИСЬ[v], v = V, определяют некоторый ориентированный граф. Очевидно, что тогда посещаются только те вершины, до которых существует путь от вершины, с которой мы начинаем поиск
1(1)
10(7)
Рис. 1 Нумерация вершин графа (в скобках), соответствующая очередности, в которой они просматриваются в процессе поиска в ширину.
Задача 3. Раскраска графа
Граф называется вершинно-К-раскрашенным, если его вершины можно раскрасить К-красками так, чтобы никакие две вершины не имели бы одинаковый цвет. Минимальное число К, при котором граф G является вершинно-К-раскрашенным называется хроматическим числом графа.
Раскрасить граф можно используя следующий алгоритм:
1. Найти число связей всех вершин графа.
2. Рассматривать вершины в порядке не возрастания числа связей.
3. Начинаем раскрашивание в цвет №1. Рассматриваем вершины последовательно и если рассматриваемая вершина не раскрашена, а также не имеет связей с вершинами раскрашеными в этот цвет, то раскрашиваем её в этот цвет.
4. Если все вершины просмотрены, но не раскрашены, то повторяем пункт 3, с цветом на единицу больше, пока все вершины не раскрашены. Число цветов это и есть хроматическое число.
Пример:
Раскрасить граф
Вычислим
степени
Рассматриваем
вершины в порядке не возрастания числа
связей. Те которые не связаны с вершинами
раскрашеными в цвет №1 раскрашиваем в
цвет №1
Рассматриваем
вершины в порядке не возрастания числа
связей. Те которые не связаны с вершинами
раскрашеными в цвет №2 раскрашиваем в
цвет №2
Рассматриваем
вершины в порядке не возрастания числа
связей. Те которые не связаны с вершинами
раскрашеными в цвет №3 раскрашиваем в
цвет №3
Все вершины графа раскрашены, число цветов 3 ==> хроматическое число равно трем.
