- •Курсовая работа по курсу «Дискретная математика»
- •Некоторые базисные алгоритмы обработки графов
- •Нахождение минимального пути в графе
- •Найти минимальные пути от фиксированной вершины до произвольной вершины графа, используя алгоритм Дейкстры.
- •Найти минимальные пути от фиксированной вершины до произвольной вершины графа, используя алгоритм Форда-Беллмана.
- •А л г о р и т м Форда – Беллмана
- •Найти минимальные пути между всеми парами вершин, используя алгоритм Флойда.
- •Эйлеровы цепи и циклы
- •Построить эйлеров цикл в графе. А л г о р и т м построения эйлерова цикла
- •Построить эйлерову цепь в графе.
- •Гамильтоновы цепи и циклы
- •Генерирование всех перестановок заданного множества
- •Генерирование всех перестановок заданного множества в лексикографическом порядке
- •Рекурсивный алгоритм генерирования всех перестановок заданного множества в лексикографическом порядке
- •В первой перестановке элементы идут в растущей последовательности, а в последней – в убывающей другими словами последняя перестановка является обращением первой,
- •Генерирование всех перестановок заданного множества в антилексикографическом порядке
- •Найти минимальный остов графа, используя алгоритм Краскала.
- •Найти минимальный остов графа, используя алгоритм Прима.
- •Поиск в графах
- •Алгоритм с возвратом
- •Раскраска графа
- •Алгоритм раскрашивания графов
- •Найти хроматическое число заданного графа, используя алгоритм с возвратом для нахождения независимых множеств вершин, указать, какие вершины в какой цвет окрашиваются.
- •Найти хроматический класс заданного графа, используя алгоритм с возвратом для нахождения независимых множеств вершин реберного графа, указать, какие ребра в какой цвет окрашиваются.
- •Паросочетания
- •Построения полного потока в сети
- •Максимальный поток
- •Построения максимального потока
- •Алгоритм меток для нахождения максимального потока
- •Помечивающий алгоритм Форда – Фалкерсона для нахождения максимального потока
- •Некоторые прикладные задачи
- •Задачи об источниках и потребителях
- •Решить задачу об источниках и потребителях, сведя ее к задаче построения максимального потока в транспортной сети и используя первый алгоритм построения максимального потока .
- •Двудольные графы и паросочетания
- •Нахождение наибольшего паросочетания в двудольном графе
- •Построение совершенного паросочетания в двудольном графе
- •Системы различных представителей
-
Найти минимальные пути между всеми парами вершин, используя алгоритм Флойда.
Очевидно, что задачу определения расстояния между всеми парами вершин можно решить, используя n раз (поочередно для каждой вершины) один из описанных ранее алгоритмов. Однако оказывается, что n-кратное использование этих алгоритмов не является наилучшим методом. Рассмотрим более эффективный алгоритм для решения поставленной задачи – алгоритм Флойда.
Идея этого алгоритма следующая. Рассмотрим орграф D = (V,X), где V={v1,…,vn}. Обозначим через dij(m) длину кратчайшего из путей из vi в vj с промежуточными вершинами из множества {v1,…,vm}.
Тогда имеем следующие уравнения:
dij(0) = cij,
dij(m+1) = min ( dij(m), dim(m) + dmj(m)).
Обоснование второго уравнения достаточно простое. Рассмотрим кратчайший путь из vi в vj с промежуточными вершинами из множества {v1,…, vm,vm+1}. Если этот путь не содержит vm+1 , то dij(m+1) = dij(m) . Если же он содержит vm+1 , то, деля путь на отрезки от vi до vm+1 и от vm+1 до vj , получаем равенство dij(m+1) = dim(m) + dmj(m) . Приведенные уравнения дают возможность вычислить расстояния d(vi,vj) = dij(n) , где 1 i, j n.
А л г о р и т м Ф л о й д а
Данные: матрица весов С(D) орграфа D.
Результат: расстояния между всеми парами вершин D[i,j] = d(vi,vj).
-
Для всех i = 1,…,n , j = 1,…,n положим D[i,j] = cij .
-
Для всех i = 1,…,n положим D[i,i] = 0.
-
Положим m = 1.
-
Положим i = 1.
-
Положим j = 1.
-
D[i,j] = min ( D[i,j], D[i,m] + D[m,j] ).
-
Если j < n, то положим j = j + 1 и переходим к шагу 6.
-
Если i < n, то положим i = i + 1 и переходим к шагу 5.
-
Если m < n, то положим m = m + 1 и перейдем к шагу 4, иначе алгоритм заканчивает работу. Полученные значения D[i,j] дают расстояния между вершинами vi и vj .
Замечание. Дополнить описанный алгоритм шагами, позволяющими находить сам путь от вершины vi до вершины vj.
Пример. Определим длины минимальных путей между любыми парами вершин орграфа, изображенного на рис.1. Все вычисления будем проводить с помощью матриц D.
m = 1 m = 2
-
v1
v2
v3
v4
v5
v6
v1
v2
v3
v4
v5
v6
v1
0
5
5
2
12
v1
0
5
5
2
12
v2
0
2
v2
0
2
v3
2
0
v3
2
0
v4
2
0
v4
2
0
v5
1
2
0
v5
1
2
0
v6
0
v6
0
Положим m = 1. Если i = 1 или j = 1, то элементы матрицы остаются без изменения, т.к. D[i,j] = min ( D[i,j], D[i,m] + D[m,j] ). Поэтому рассмотрим случай, когда i = 2 , а j = 3. Тогда D[2,3] = min ( D[2,3], D[2,1] + D[1,3] ) = min (,+5) = . Далее, j = 4, т.е. D[2,4] = min(D[2,4], D[2,1] + D[1,4] ) = min (,+5) = . Продолжаем процесс до тех пор, пока i 6 и j 6. Положим m = 2 и продолжим рассуждения дальше.
m = 3 m = 4
-
v1
v2
v3
v4
v5
v6
v1
v2
v3
v4
v5
v6
v1
0
5
5
2
12
v1
0
7
5
5
2
9
v2
0
2
v2
0
2
v3
2
0
4
v3
2
0
4
v4
2
0
4
v4
2
0
4
v5
1
2
0
v5
3
1
2
0
5
v6
0
v6
0
m = 5 m = 6
-
v1
v2
v3
v4
v5
v6
v1
v2
v3
v4
v5
v6
v1
0
7
5
5
2
9
v1
0
5
3
4
2
7
v2
0
2
v2
0
2
v3
2
0
4
v3
2
0
4
v4
2
0
4
v4
2
0
4
v5
3
1
2
0
5
v5
3
1
2
0
5
v6
0
v6
0
Матрица D:
-
v1
v2
v3
v4
v5
v6
v1
0
5
3
4
2
7
v2
0
2
v3
2
0
4
v4
2
0
4
v5
3
1
2
0
5
v6
0