lec6

6. Задачи в графи

***Компоненти на свързаност [5.6.1]
Задача: Даден е неориентиран граф с n върха и m дъги. Да се провери дали е свързан, т.е. дали съществува път между всеки два негови върха. В случай, че не е свързан, да се намерят всички негови свързани компоненти, т.е. всички максимални свързани негови подграфи.
Алгоритъм:
Задачата може да се реши чрез обхождане на графа, например в дълбочина:
1) Започваме от произволен връх и всички върхове, които разгледаме при обхождане- то, маркираме като принадлежащи на една свързана компонента. Ако тя съдържа всички върхове на графа, следва, че той е свързан.
2) Ако са останали необходени върхове, това означава, че графът не е свързан. Започваме ново обхождане от непосетен връх и строим втора свързана компонента. Повтаряме стъпка 2), докато не останат необходени върхове.
Сложността на алгоритъма е O(n+m).

***Компоненти на силна свързаност в ориентиран граф [5.6.2]
Ориентираният граф се нарича силно свързан, ако съществува път както от i до j, така и от j до i, за всеки два различни върха i и j.
Задача: Ако графът не е силно свързан, се интересуваме от всички компоненти на силна свързаност (всички максимални силно свързани подграфи).
Алгоритъм:
1) Избираме произволен връх i.
2) Изпълняваме DFS(i) и намираме множеството от върхове R, достижими от i.
3) Образуваме “обърнат” граф - посоките на всички ребра в който са “обърнати”, т.е. реброто (i, j) става (j. i).
4) Изпълняваме обхождане в дълбочина от върха i -  така намираме множеството от върхове Q, достижими от i в обърнатия граф (и съответно които достигат i в началния граф).
5) Сечението на R с Q дава една силно свързана компонента.
6) Изключваме тази компонента от графа и, ако има още върхове, повтаряме стъпка
1).
Описаният алгоритъм има сложност O(n (n + m)).
С наредба на върховете може да се получи и алгоритъм със сложност O(m+n).

*** Минимален път в граф [5.4.2]
Задача: Даден е претеглен ориентиран граф и търсим най-кратките разстояния от даден връх i до всички останали върхове.

Алгоритъм на Форд-Белман: (стр. 284)

1) Въвеждаме масив D, като след завършване на алгоритъма, D[i] ще съдържа дължината на минималния път от s до всеки друг връх i от графа. Инициализираме D[i] = A[s][i], за всеки връх.
2) Опитваме да оптимизираме стойността на D[i], за всяко i по-следния начин:
     За всяко j, ако D[i] > D[j] + A[j][i], присвояваме D[i] = D[j] + A[j][i].
3) След повтаряне на стъпка 2) n – 2 пъти, в масива D ще се съдържат търсените минимални пътища.
for(k = 1; k <= n - 2; k++) /*повтаряме(n-2)пъти*/
   for (i = 0; i < n; i++)
      for (j = 0; j < n; j++)
         if (D[i] > D[j] + A[j][i])  D[i] = D[j] + A[j][i];

Сложността на алгоритъма е O(n3).

Алгоритъм на Флойд: (стр. 285)
Алгоритъмът на Флойд е подобен на този на Форд-Белман. Съществената разлика е, че след като той приключи работа, разполагаме с дължините на минималните пътища между всяка двойка върхове от графа и то без да е необходима допълнителна памет (използва се матрицата на теглата на дъгите му).

Сложността на алгоритъма е O(n3).

Алгоритъм на Дейкстра (стр. 290)
Dijkstra's algorithm - лекция в MIT
Dijkstra Shortest Path

** Най-дълъг път в ацикличен граф (критичен път) (стр. 295)
Задача: Екип от програмисти разработва програмен продукт, който се състои от отделни задачи. Всяка задача има определена продължителност и свързва два етапа от разработването на продукта: начален и краен. Една задача не може да бъде започната, ако не е завършен началният ѝ етап. За да бъде завършен изцяло един етап, трябва да бъдат завършени всички задачи, за които той се явява краен. Да се определи минималното време (при условие, че разполагаме с неограни- чен брой програмисти), достатъчно за завършването на целия проект. Проектът се счита за завършен, когато са завършени всичките му етапи.
Алгоритъм:
Алгоритъмът се основава на техниката динамично оптимиране.
critical
Алгоритъмът има сложност O(n+m).

*** Хамилтонов цикъл [5.4.4]
Хамилтонов цикъл в граф се нарича цикъл, съдържащ всеки връх от графа точно веднъж. Граф, съдържащ такъв цикъл, се нарича Хамилтонов.

Задача:

Да се провери дали даден граф е Хамилтонов.
Алгоритъм:
Намиране на всички прости пътища между начален и краен връх, като двата върха съвпадат.

Задача за търговския пътник:
Да се намери Хамилтонов цикъл с минимална дължина в претеглен граф.

Алгоритъм:
Пълно изчерпване с намиране ва всички хамилтовови цикли.
 Travelling salesman problem
Сложност на алгоритъма е O(n22n).

*** Ойлерови цикли [5.4.5]
 Кьонингсбергските мостове
Нека е даден свързан мултиграф. Цикъл, в който всяко ребро участва точно по веднъж, се нарича Ойлеров цикъл. Един мултиграф се нарича Ойлеров, ако в него съществува Ойлеров цикъл.
Аналогично се дефинира и Ойлеров път в граф.
Теорема. (смятана за първата теорема в теорията на графите, изказана от Ойлер без доказателство).
Свързан неориентиран мултиграф съдържа Ойлеров цикъл, тогава и само тогава, когато всички върхове на графа са от четна степен.

euler

ОЙЛЕРОВИ ПЪТИЩА В ГРАФ

Задача за китайския пощальон
Задача: Даден е произволен претеглен свързан неориентиран граф с цени по ребрата неотрицателни числа (за да има решение задачата). Намерете цикъл, който минава поне по един път през всички ребра на графа, такъв че цената на този цикъл да е минимална.

Максимален поток [5.4.6]
Нека е даден ориентиран граф, в който върховете са разделени в три множества:
- множество от източници на някакъв материал;
- множество от консуматори;
- множество от междинни върхове - връзки, през които материалът може да бъде разпределян до други връзки или консуматори.
На всеки източник е съпоставено число - максимално количество материал, което може да доставя, а за всеки консуматор е дадено максималното количество материал, което може да приема. Ориентираните ребра (i,j) от графа могат да бъдат интерпретирани като "тръби", свързващи върховете i и j, като за всяко ориентирано ребро дефинираме:
1) Функция c: c(i, j) ограничава количеството материал, което може да преминава през реброто (i,j), c(i,j) > 0.
2) Функция t: t(i, j) показва разхода (цената) за пренасяне на материала през реброто (i,j).
Общата задача за намиране на поток с минимална цена (minimum cost network flow problem) се състои в това да се намери схема за доставяне на материала от източниците до консуматорите така, че общият разход за пренасянето да бъде минимален.
maxflow

- Форд-Фулкерсон

*** Минимално покриващо дърво [5.7.1]
Покриващо (oбхващащо) дърво в свързан неориентиран граф се нарича всеки свързан ацикличен подграф, съдържащ всички възли на графа
(Spanning tree). Покриващо дърво  с минимална сума от теглата на участващите в него ребра се нарича минимално покриващо дърво.

Ще разгледаме два известни евристични алгоритъма, които решават дадената задача.
- Крускал
- Прим


VisuAlgo - visualising data structures and algorithms through animation

Data Structure Visualizations

Домашно - задачи 7 и 8.