
- •Задачи для программирования по темам
- •Направление ″бизнес-информатика″, специальность ″математические методы в экономике″
- •1 . Обходы графа . Вычисление числа компонент связности графа.
- •2. Алгоритмы поиска путей в графе.
- •3. Алгоритмы нахождения минимального остова в графе
- •4. Хроматическое число графа. Алгоритм правильной раскраски вершин графа методом перебора с возвратами.
- •5. Транспортные сети. Теорема форда-фалкерсона о максимальном потоке в транспортной сети
- •6А. Варианты задач для групп по направлению ″бизнес-информатика″ тема ″транспортные сети″
- •6Б. Варианты задач для групп по специальности ″математические методы в экономике″
- •7.Задачи по теме ″рекурсивные функции″.
- •1. Доказать, что следующие функции примитивно рекурсивны:
- •8. Задачи по теме ″машины тьюринга″
- •2. (Гаврилов г. П., Сапоженко а.А. Задачник. С. 220-221, идея из № 1.2.) Построить машину в алфавите , , которая:
- •3. (Гаврилов г. П., Сапоженко а.А. Задачник. С. 221, № 1.3.) По заданной машине Тьюринга и начальной конфигурации найти заключительную конфигурацию:
- •4. (Лавров и.А., Максимова л.Л. С. 138, № 1.) Какую функцию вычисляет машина Тьюринга со следующей программой п:
- •5. (Лавров и.А., Максимова л.Л. С. 139, № 5.) Построить следующие машины Тьюринга в алфавите , , начальную конфигурацию в заключительную конфигурацию :
2. Алгоритмы поиска путей в графе.
Постановка
задачи.
Дан простой ориентированный граф
с множеством вершин
и множеством рёбер
(без петель и кратных дуг). На множестве
дуг задана неотрицательная
вещественная функция
(длины дуг). Длина
пути
из вершины
в вершину
определяется
как сумма длин дуг, составляющих путь
.
Задача 1. Одна из вершин выделена как источник. Требуется найти кратчайшие пути из источника ко всем остальным вершинам.
Задача 2. Найти кратчайшие пути между всеми парами вершин.
Для решения задачи 1 рассмотрим ″жадный″ алгоритм Дейкстры:
Алгоритм
строит (использует) множество
вершин, для которых кратчайшие
пути из источника уже найдены. На каждом
шаге к множеству
добавляется та из оставшихся вершин
которая ближе к источнику по сравнению
с другими оствшимися вершинами. Так
как длины дуг неотрицательны, то можно
быть уверенны в том, что кратчайший путь
проходит от источника к конкретной
вершине через вершины множества
.
На каждом шаге алгоритма используется
массив
,
в который записываются длины кратчайших
путей для каждой вершины. Причём если
,
то значение
становится окончательным.
Алгоритм Дейкстры
Пусть dist – двумерный массив, причём dist [v,w] равно длине дуги (v,w) из вершины v в вершину w. Если такой дуги не существует, то полагаем dist [v,w]= ∞.
S
← {1}; вершина
взята как источник
L[1] ← 0;
for v ← 2 to n do
L[v] ← dist [1,v]; pred[v] ← v
od;
for i ← 1 to n − 1 do
найдём вершину w ∈ V \ S, для которой значение L[w]минимально;
S ← S ∪ {w};
for ∀v ∈ V \ S do
m ← L[w] + dist [w,v];
if L[v] > m then {L[w]← m; pred[v] ← w
od
od.
Результат: L[v]− длина кратчайшего пути из вершины 1 в вершину v. При этом v, pred[v], pred[pred[v]],..., 1 есть вершины, составляющие кратчайший путь из вершины 1 в вершину v.
Обоснование алгоритма Дейкстры (кратко)
Допустим,
что для полученного пути из источника
в
имеется более короткий путь в
,
который проходит до вершины
через вершины множества
и выходит из него, затем путь, возможно,
несколько раз заходит в
и выходит из него, пока не достигнет
вершины
.
В этом случае вместо
была бы выбрана вершина
.
Противоречие.
Другая
возможность кратчайшего пути не
реализуема, поскольку путь из
в
через вершины множества
короче, чем через вершину
по построению.
Рассмотренный
алгоритм имеет временню
сложность O
(
).
Для рещения второй задачи существует
алгоритм (Флойда , основанный на процедуре
Уорщолла для вычисления транзитивного
замыкания) со сложность
O
(
),
причем допускаются даже отрицательные
веса дуг графа.
3. Алгоритмы нахождения минимального остова в графе
Постановка
задачи.
Дан
простой неориентированный граф
с множеством вершин
и множеством рёбер
(без петель и кратных дуг). На множестве
рёбер задана вещественная функция
(величина
называется стоимостью
ребра
).
Остов
графа
−любой
подграф
,
,
графа
,
являющий деревом. Стоимость остова
определяется как сумма стоимостей
входящих в него рёбер.
Требуется
найти остов
графа
,
имеющий наименьшую стоимость по сравнению
с другими возможными остовами.
Существует несколько алгоритмов решения этой задачи. Наиболее известны:
″Жадный″
алгоритм Крускала,
ориентированный на работу с рёбрами.
Его времення
сложность равна O(
),
где
− число рёбер графа.
Алгоритм
ближайшего соседа Прима и Дейкстры,
ориентированный на работу с вершинми.Его
временная сложность равна O(
),
где
− число вершин графа.
Алгоритм Крускала
1.
(Предварительная
сортировка рёбер.)
Рёбра
графа
помещаются в очередь Q
по неубыванию их стоимостей.
2. (Непосредственное построение остова.)
T
← ∅; искомое
множество рёбер
пока
не построено
e ⟸ Q; извлекаем ребро из очереди
T
← T
∪
{e};
и
помещаем его в искомое множество
while
do
множество
должно
содержать
рёбер
e ⟸ Q; извлекаем очередное ребро из очереди
if ребро e не образует цикла с вершинами ранее включёнными в T
then T ← T ∪ {e}
od.
Обоснование (корректность) алгоритма
Пусть
− рёбра построенного остова
,
записанные в порядке неубывания их
стоимостей,
– минимальный по стоимости остов графа
графа
,
которыё содержит рёбра
из
для наибольшего возможного
.
Добавление
в
приводит к образованию цикла в остове
,
который будет содержать ребро
,
.
Заметим, что
,
так как в противном случае ребро
было бы включено в
.
Допущение
также приводит к противоречию: стоимость
остова
,
где
,
будет меньше стоимости минимального
остова
.
Значит,
.
Однако, это противоречит способу выбора
индекса
.
Следовательно,
−
минимальный остов.
Реализация алгоритма. Наиболее сложным в этом алгоритме является реализация оператора if Его эффективная реализация может быть осуществлена с помощью операций НАЙТИ и ОБЪЕДИНИТЬ для совокупности непересекающихся множеств.
Первоначально
искомое дерево не имеет рёбер, т.е.
∅, и состоит из изолированных вершин
множества
.
По мере включения в
рёбер образуются частичные остовы
(поддеревья), которые последовательно
объединяются в единое дерево. Ребро
включается в
,
если его концы принадлежат разным
частичным остовам
и
.
При этом остовы
и
объединяются в один остов
.
Каждый такой остов представлен множеством
своих вершин, в качестве имени которого
выбирается одна из его вершин.
(ПРИВОДИТСЯ РЕАЛИЗАЦИЯ − ПРОПУЩЕНО)
Временная
сложность алгоритма Крускала.
Времення
сложность алгоритма равна
O(),
поскольку за такое время может быть
реализована как первая, так и вторая
фазы алгоритма. Алгоритм
Прима-Дейкстры
может быть реализован со сложностью O
(
).