- •3. Алгоритмы на графах
- •3.1. Общие положения
- •3.2. Алгоритмы нахождения оптимального пути
- •Волновой алгоритм построения кратчайшего пути для взвешенного графа.
- •1. Результаты прямого прохода алгоритма приведены в табл. 3.4.
- •2. Обратный ход:
- •3.3. Нахождение компонент связности
- •Пример 3.5
- •3.4. Алгоритмы нахождения подграфов
- •3.5. Дерево. Остов
- •Пример 3.7
- •3.5.3. Алгоритм построения системы независимых циклов графа
- •Пример 3.12
- •3.6. Алгоритм кратчайшей раскраски графа
- •3.7. Задачи для самостоятельной работы
П
шинами
xн
и xк,
используя волновой алгоритм. Рассмотрим
краткое решение этой задачи.
1. Результаты прямого прохода алгоритма приведены в табл. 3.4.
2. Обратный ход:
Таблица 3.4
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
M |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
4 |
0 |
0 |
0 |
2,3 |
0 |
1 |
4 |
6 |
0 |
0 |
3,4 |
0 |
1 |
4 |
6 |
8 |
0 |
4,5 |
0 |
1 |
4 |
6 |
8 |
10 |
5,6 |
0 |
1 |
4 |
6 |
8 |
10 |
6 |
0 |
1 |
4 |
6 |
8 |
10 |
|
Дуги-претенденты: (x1 x2), (x1 x3), (x2 x4), (x3 x4), (x3 x5), (x4 x6), (x5 x6).
3. Построены три длиннейшие пути:
L1: (x1 x2),(x2 x4), (x4 x6); L2: (x1 x3), (x3 x4), (x4 x6); L3: (x1 x3), (x3 x5), (x5 x6).
3.3. Нахождение компонент связности
Вершины xi и xj слабо связны, если в графе существует путь (xi, xj).
Вершины xi и xj сильно связны, если существуют пути (xi, xj) и (xj, xi).
Если в графе нет путей из xi в xj и нет обратного пути из xj в xi, то вершины xi и xj несвязны. Для неориентированного графа имеет смысл только понятие сильной связности.
Компонентой связности называется максимальное подмножество сильно связанных между собой вершин.
Отношение связности рефлексивно, симметрично, транзитивно, т. е. является отношением эквивалентности, и однозначно разбивает множество вершин графа на компоненты связности.
Пример 3.4: Задан граф (рис.3.4). Найти его компоненты связности.
Данный
граф может быть разбит на следующие
компоненты связности:
1){x1,x2,x3,x4};
2){x5,x6,x7}; 3){x8}
Между
компонентами - только слабая связность:
есть пути из вершин 1-й компоненты в
вершины 2-й и 3-ей компоненты, а также из
вершин 2-й компоненты в вершину 3-ей.
Рис.
3.4
Алгоритм построения компонент связности в неориентированном графе
1. i=0. Все вершины графа не отмечены.
2. i=i+1. Выбираем очередную неотмеченную вершину, отмечаем её и все связанные с нею вершины значением индекса i с помощью распространения волны отметок по ребрам, идущих от уже отмеченных индексом i вершин. Таким образом выделяется i компонента связности. Если есть ещё неотмеченные вершины, то выполняется п.2, иначе выделение компонент связности закончено.
Пример 3.5
Рис. 3.5
Решение:
1. i=0
2. i=1. Отмечаем индексом i=1 вершину x1 и связанные с ней вершины x3, x7 и x9. Получена первая компонента связности: k1 {x1,x3,x7,x9 }
2. i=2. Отметим индексом i=2 вершину x2 и вершины x6,x10. Построена вторая компонента связности: k2 {x2,x6,x10}
2. i=3. Отмечаются индексом i=3 вершины x4 и x8 . Построена третья компонента связности: k3 {x4, x8 }.
2. i=4. Отмечаются индексом i=4 вершину x5, которая формирует четвертую компоненту связности – k4 {x5}
3.4. Алгоритмы нахождения подграфов
Циклом называется замкнутый маршрут в неориентированном графе. Для ориентированного графа определяется аналогично понятие контур - замкнутый путь.
Пример 3.6. В графе (рис.3.6) каждому ребру присвоен свой номер. Выделим соответствующее ему число циклов. Для нашего примера циклами Ci являются замкнутые маршруты, образованные ребрами : C1={1, 2, 5, 4}, C2={5, 6, 7}, C3={3, 6, 2}, C4={1, 2, 6, 7, 4} и т. д. Среди этих циклов найдутся такие, которые включают в себя другие циклы. Так, цикл C4 состоит из циклов C1 и C2 , у которых имеется общее ребро 5, не вошедшее в цикл 4.
Говорят, что цикл 4 получен линейной комбинацией циклов 1 и 2, т. е. является линейно зависимым от них.
Рис. 3.6
Линейнозависимым от некоторой совокупности других циклов называется цикл, который можно построить линейной комбинацией циклов в этой совокупности.
Присвоим каждому ребру графа номер j, j=1,m и сопоставим каждому циклу Сi двоичный m-разрядный вектор Vi , компоненты vij которого определяются следующим образом: vij = 0, если ребро j не входит в цикл Ci , vij = 1 - в противном случае.
Тогда линейной комбинацией векторов Vi является результат векторной операции сложения по модулю два этих векторов.
Поскольку Vi - отношение принадлежности рёбер графа циклу Ci , а Ci - это множество рёбер, то в результате применения векторной операции мы получаем совокупность рёбер, входящих в циклы, составляющих линейную комбинацию за исключением общих для этих циклов рёбер.
На языке теории множеств это означает объединение множеств Ci без их пересечения, что соответствует операции «симметрическая разность» двух множеств.
j |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
V1 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
|
|
|
|
|
|
|
|
V2 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
V4 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
В нашем примере общим является ребро 5, которое исключено из цикла 4.
Линейно-независимым от совокупности других циклов называется цикл, который не может быть построен линейной комбинацией этих циклов.
Максимальное множество линейно-независимых циклов образует систему независимых циклов; мощность этого множества называется цикломатическим числом. Это число определяется по формуле Эйлера
=m-n+p (3.2)