Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МВ лаб роб дискретна математика.DOC
Скачиваний:
19
Добавлен:
06.11.2018
Размер:
508.42 Кб
Скачать

Контрольні питання

  1. Які графи можна назвати мережами?

  2. Як формулюються задачі про максимальний потік у мережі?

  3. Що розуміють gід розрізом мережі?

  4. Як пов’язані між собою мінімальний розріз мережі і максимальний потік в ній?

  5. Яким є метод Форда-Фалкерсона для побудови максимального потоку мережі?

Лабораторна робота № 6 Визначення найкоротшого шляху в графі

Мета роботи: визначити найкоротший маршрут в графі, використовуючи алгоритм Дейкстри.

  1. Теоретичні відомості.

Алгоритм, що розглядається, визначає відстані між вершинами в простому орграфі з невід’ємними вагами. До таких орграфів зводиться велика кількість типів графів. Якщо граф не є простим, то його можна звести до такого, відкидаючи всі петлі і замінюючи кожну множину паралельних ребер тнайкоротшим ребром (ребром з найменшою вагою) з цієї множини, кожне неорієнтоване ребро замінюється парою орієнтованих ребер. Якщо граф не є зваженим, то можна вважати, що всі ребра мають однакову вагу.

Нехай G=(X, U, F) – простий орграф, для кожного ребра якого визначена вага . Знайдемо найкоротший шлях між вершинами x0 і z (мал.1).

 z

10

2

x1 x4

 

5 6

7

3 8 1 3 5 3

   

x0 2 x2 5 x3 7 x5

Мал.. 1. Простий зважений орграф

Неіснуючі ребра будемо вважати ребра з нескінченними вагами. Суму вагів ребер шляху будемо називати вагою або довжиною шляху. Позначимо wij = w(u) – вага ребра u=(xi, xj). Алгоритм пошуку найкоротшого шляху, починаючи з вершини x0, розглядає граф у ширину, помічаючи вершини xj значеннями-мітками їх відстаней від x0. Мітки можуть бути тимчасовими і остаточними. Тимчасова мітка вершини xj – це мінімальна відстань від x0 до xj, коли у визначені шляху на графі враховуються не всі маршрути від x0 до xj. Остаточна мітка xj- це мінімальна відстань на графі від x0 до xj. Таким чином, в кожний момент часу роботи алгоритму деякі вершини будуть мати остаточні мітки, а інша їх частина – тимчасові. Алгоритм закінчується тоді, коли вершина z отримає остаточну мітку , тобто відстань від x0 до z.

Спочатку вершині x0 присвоюється значення 0 (нульова відстань до самої себе), а кожній з інших |X|-1 вершині присвоюється тимчасова мітка  (нескінченність). На кожному кроці одній вершині з тимчасовою міткою присвоюється остаточна і пошук продовжується далі. На кожному кроці мітки змінюються таким чином.

  1. Кожній вершині xj., яка не має остаточної мітки, присвоюється нова тимчасова мітка – найменша з її тимчасової мітки і числа (wij + остаточна мітка xі ), де xі – вершина, якій присвоєна остаточна мітка на попередньому кроці.

  2. Визначається найменша з усіх тимчасових міток, яка і стає остаточною міткою своєї вершини. У випадку рівності міток вибирається довільна з них.

Циклічний процес п.1+п.2 продовжується до тих пір, поки вершина z не отримає остаточну мітку. Легко бачити, що остаточна мітка кожної вершини– це найкоротша відстань від цієї вершини до вершини x0.

Розглянемо приклад пошуку найкоротшого шляху на графі, представленому на мал.1. Процес визначення міток вершин графа на кожному кроці зручно представляти у вигляді таблиці.

x0

x1

x2

x3

x4

x5

x6

0

0

1

7

2

2

5

7

3

6

10

15

4

9

13

15

5

12

11

Зауважимо, що виділені клітинки – це остаточні мітки відповідних вершин, тобто відстані від них до вершини x0. ЗА такою таблицею легко відтворити шлях переміщення від z до x0 .

Реалізація розглянутого алгоритму пошуку найкоротшого шляху представлена алгоритмом, в якому граф G=(X, U, F) представлений матрицею вагових коефіцієнтів We=[ wij], вага неіснуючого ребра позначається як +. Вектор Mark[x] міток вершин встановлює належність вершині xX остаточної (TRUE) або тимчасової (FALSE) мітки. Вектор Dist[x] в алгоритмі фіксує поточні значення міток вершин. Вектор Prev[x] дозволяє відновити у зворотній послідовності вершини найкоротшого шляху.

Алгоритм 1. Алгоритм найкоротшого шляху на орграфі

{Введення початкових даних}

Assign (f,’ short.in’);

Reset (f); {Файл відкритий для зчитування}

{Введеня початкових даних}

Read (f, x0) {Початкова вершина шляху}

Read (f, z) {Кінцева вершина шляху}

Read (f, nx) {Кількість вершин в графі}

nx :=nx – 1;

for i := 0 to nx do

begin

for j := 0 to nx do

begin

read (f, We [i,j]); {Введення матриці вагових коефіцієнтів}

if We [i,j] :=0 then We [i,j] :=$7fff; {нескінченність}

end;

end;

close (f);

assign (f, ‘short.in’);

rewrite (f); {Файл відкритий для запису}

for x :=0 to nx do

begin

Mark[x] := FALSE;

Dist[x] := $7fffffff;

end;

y := x0;

Mark[x0] := TRUE;

Dist[x0] := 0;

while not Mark[z] do

{Поновити тимчасові мітки}

begin

for x:=0 to nx do

if not Mark[x] and Dist[x] > Dist[y]+We[y,z] then

begin

Dist[x] := Dist[y]+We[y,z];

Prev[x]:=y;

end;

{Пошук нової вершини yX з мінімальною тимчасовою міткою}

weight:= $7fffffff;

for x:=0 to nx do

if not Mark[x] then

if weight > Dist[x] then

begin

weight:= dist[x];

y:=x;

end;

Mark[y[ := TRUE;

end;

write (f, ‘Вершини найкоротшого шляху’);

x := z;

while x<>x0 do

begin

write (f, x:2);

x:= prev[x];

end;

writeln (f, x:2);

writeln (f, ‘Довжина шляху’, Dist[z]);

Початкові дані графа представлені матрицею вагоаих коефіцієнтів його ребер в текстовому файлі Short.in з такою структурою:

  • в першому рядку вказується номер початкової вершини шляху x0;

  • в другому рядку вказується номер кінцевої вершини шляху z;

  • в третьому рядку вказується кількість nx вершин в графі;

  • в наступних nx рядках вказуються рядки матриці вагових коефіцієнтів графа.

Для даного приклада початкові дані матимуть вигляд:

0

6

7

0 7 2 0 0 0 0

0 0 0 1 5 0 10

0 3 0 5 0 0 0

0 0 0 0 3 7 0

0 0 8 0 0 5 2

0 0 0 0 1 0 6

0 0 0 0 0 0 0

Результати обчислень зберігаються в файлі Short.in з такою структурою:

Вершини шляху = 6 4 3 1 2 0

Довжина шляху = 11.