Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_Ответы по курсу типы и структуры данных.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
104 Кб
Скачать
☆

15. Матричное и списковое представление графов.

Граф – пара G=<V,E>, В – конечное множество вершин, Е – множество ребер (пар вершин).

Матрица инциденций А(NxM) – н строк по числу вершин, и м столбцов по числу рёбер. Столбец, соответствующий ребру <Х,У> содержит 1 в строке, соответствующей вершине Х и -1 в строке, соответствующей У (для орграфа; для неорграфа – обе 1) и 0 в остальных строках.

Более эффективно представление матрицей смежности B(NxN) – н строк и столбцов по числу вершин. Элемент b[ij]=1, если есть ребро из вершины I в вершину J и 0в противном случае.

Возможно представление графа списком ребер, тогда требуемый объём памяти – всего лишь 2*M.

Во многих случаях лучшее решение для представления графа – список инциднтности. Для каждой вершины V содержится список вершин U таких, что V->U; каждый элемент списка инцидентности является записью, содержащей вершину и указатель на следующий элемент. При этом начало каждого списка хранится в таблице BEG, т.е. BEG[V] – указатель на начало списка вершин, непосредственно связанных с вершиной v.

16. Поиск путей в графах. Алгоритм поиска в глубину. Алгоритм поиска в ширину.

Поиск в глубину из вершины v основан на поиске в глубину из всех новых вершин, смежных с v. Используются массивы New «новости» вершин и Zap списков смежности вершин. Изначально все вершины помечены как новые; при вызове функции поиска для вершины V для всех вершин U из её списка смежности, не являющихся новыми, происходит вызов функции поиска.

Поиск в ширину использует очередь. Для каждой вершины V производится просмотр всех смежных с ней вершин U, являющихся новыми; вершина U при этом помещается в очередь. Параллельно формируется список кратчайших путей в каждую вершину U из вершины V – для каждой просмотренной вершины V есть Prev[V], из которой произведён

17. Алгоритм построения каркасов в графе.

Каркасом графа <V,E> называется дерево <V,T>, где Т принадлежит Е; множество вершин каркаса совпадает с множеством вершин самого графа.

Алгоритм построения каркаса схож с алгоритмом поиска в глубину. Вначале все вершины графа помечаются как «новые», множество ребер каркаса пусто. Вызывается функция поиска для стартовой вершины.

При вызове функции для некоторой вершины V, с вершины снимается метка «новости»; для всех вершин U из её списка смежности, являющихся новыми, ребро {V,U} добавляется к списку рёбер каркаса, а затем для вершины U вызывается функция поиска.

Возможна реализация алгоритма с использованием поиска в ширину – в нём также все «новые» вершины U из списка смежности V заносятся в очередь обработки, а ребра {V,U} добавляются в список рёбер каркаса.

18. Пути в графах. Алгоритм поиска Эйлерова и Гамильтонова пути в графе.

Произвольный путь в графе, проходящий через каждое ребро графа ровно один раз, называется эйлеровым; по одним и тем же вершинам путь может проходить неоднократно. Эйлеров путь представляется последовательностью вершин в рабочем стеке ST, а стек SE содержит последовательность полностью обработанных вершин.

Алгоритм построения эйлерова пути: изначально оба стека пусты. Выбирается произвольная вершина графа V и заносится в список ST. Далее, пока ST не пуст, в V выбирается верхний элемент рабочего стека ST. После этого каждая вершина U из списка смежности V помещается в рабочий стек, ребро {V,U} удаляется из списка смежности V и U. После того, как список смежности V становится пустым, V удаляется из рабочего стека и помещается в результирующий стек SE. Процесс повторяется.

Путь в графе, проходящий через каждую ВЕРШИНУ ровно один раз, называется гамильтоновым. Не существует ни одного простого необходимого и достаточного условия для существования ГП в графе.

В глобальном векторе X строится последовательность вершин X[1],…X[k-1] строящегося пути; логический вектор DOP показывает, можно ли вставить вершины в проектируемый путь, n – кол-во вершин графа.

Procedure Ham(k); {}

Begin

For u in ZAP[X[k-1]] do

If (k=n+1) {если все вершины уже вставлены в путь}

And (u=v0) {и если последняя в-на в пути совпадает с 1-ой}

{т.е. это цикл}

Then Write(X[1],…X[k-1],v0) {печать пути и возможное окончание

алгоритма}

Else

If DOP[u] {если вершину можно вставить в путь}

Then

Begin

X[k] <- u; DOP[u] <- False;

If k<= n Then

Ham(k+1); {очередное удлинение пути привело в тупик –}

Else

DOP[u] <- True;

{необходимо вернуться для следующей попытки}

End;

End; {Ham}

Begin

For v in V do DOP[v] <- True; {инициализация}

X[1] <- v0; {v0 – произвольная фиксированная вершина графа}

DOP[v0] <- False;

Ham(2); {начало построения пути длиной 2}

End.

19. Алгоритм поиска кратчайших путей в графе.

Алгоритм Дейкстры – используется для определения кратчайшего пути из одной вершины графа в остальные. Однако он работает только на неотрицательных весах рёбер. Для поиска во взвешенном графе с отрицатльными ребрами используется алгоритм Беллмана-Форда. Находит кратчайшие пути от одной верины графа до всех остальных.

Procedure Bellman_Ford(G,w,S)

Initz(G,S)

for i:=1 to |V[G]| - 1 //для всех вершин кроме S

do

for каждого ребра UV in E|G|

do

Relax(U,V,w) //релаксируем каждое ребро

for каждого ребр UV in E|G| //проверяем нет ли отрицательного цикла

do

if (D[v] > D[u] + w(u,v)

then

return false; //отрицательный цикл

return true;

На выходе получаем граф, с размеченными вершинами – кратчайшими дистанциями до этой вершины от точки S.

20. Алгоритм поиска кратчайших путей между всеми вершинами графа.

Алгоритм Флойда-Уоршелла используется для нахождения кратчайших путей между всеми вершинами взвешенного ориентированного графа. Используется матрица A размером n*n, в которой вычисляются длины кратчайших путей.

Procedure Floyd_Warshall - алгоритм Флойда – Уоршалла O(n3)

{минимальный путь между всеми вершинами}

N <- размер матрицы A

D(0) <- A начальная матрица D содержит A

For K <- 1 to N

Do For I <- 1 to N

Do For J <- 1 to N

Do d(k) i,j <- min (d (k-1) I,j , d (k-1) i,k + d (k-1) k,j)