You are on page 1of 16

за интерна употреба

Алгоритми и структури на податоци

– белешки од предавања –

11. Некои алгоритми кои се


применуваат врз графовите
11.1 Тополошко сортирање
Тополoшкото сортирање се извршува над ориентирани графови кои не
содржат циклуси. Ваквиот тип на графови често се користи за да покаже
временска зависност на некои настани. Можни примери се избор на
предмети при студирање со предмети наведени како предуслови,
изведување на активности во некој проект, но и редослед на облекување
(или соблекување) на парчиња од гардеробата. Визуелна претстава на
тополошкото сортирање би била поставување на сите темиња од графот
на една отсечка така што сите ребра во графот се поставени
(ориентирани) од лево на десно.

На слика 11.1а е претставен еден ориентиран нецикиличен граф кој ги


претставува хронолошките врски (временскиот редослед) на облекување
на: долен веш, пантолони, ремен, кошула, машна, палто, чорапи, чевли и
часовник. Од графот јасно се гледа дека чорапите треба да се облечат
пред чевлите или пак дека часовникот може да се стави на раката било
кога. Тополошкото сортирање на овој граф би бил еден можен редослед
на обекување што е корисно, затоа што обично повеќе парчиња
гардероба тешко се облекуваат во исто време.

слика 11.1 (a) Пример ориентиран нецикличен граф (б) Претстава на


тополошки сортиран граф

1
за интерна употреба

Идејата која може да се примени при реализирањето на тополошкото


сортирање е едноставна. Доколку се реализира изминување по
длабочина со евидентирање на времињата на завршување на
обработката на темињата (алгоритмот кој е опишан во тема 11.
Графови), темињата треба да се подредат по опаѓачки ред согласно
времето на завршување на обработката. Програмерски, тополошкото
сортирање би можело да се реализира со вметнување на темето кое
веќе не е од интерес при изминувањето по длабочина во една линеарна
поврзана листа. Визуелната претстава на овој вака тополошки сортиран
граф е дадена на слика 11.1б. Бидејќи вметнувањето на елемент во
линеарна листа е операција која се изведува во константно време,
времето на извршување на овој алгоритам би било еднакво со времето
на извршување на изминувањето на граф по длбочина.

Друга (иако во основа иста) идеја за изведба на алгоритмот за


реализација на тополошко сортирање на ориентиран нецикличен граф се
реализира со „бришење“ на темињата од графот. На почеток се избира
едно теме кое нема предходник (што мора да биде исполнето доколку
графот е ацикличен), кое се „печати“ и отстранува од графот заедно со
сите ребра кои излегуваат од него. Оваа постапка се повторува се
додека не се избришат сите темиња од графот. Оваа идеја е
претставена со генералниот псевдо код даден во продолжение:

vnesi graf G. Neka n e brojot na teminja.


1 for i ← 1 to n do //ispecat gi teminjata//
2 if sekoe teme ima svoj prethodnik
then [mrezata ima jamka i ne e vozmozno. stop]
3 izberi teme v koe nema prethodnici
4 ispecati go v
5 izbrisi go v i site vrski koi izleguvaat od v od mrezata
6 end

Псевдо кодот е илустриран на слика 11.2. Почетниот граф е даден на


слика 11.2а. Бидејќи тој има само едно теме (v1) кое нема предходници,
тоа се избира да биде прво во тополошкото сортирање на графот.
Откако тоа и сите негови излезни ребра ќе се отстранат од графот се
добива графот од слика11.2б. Бидејќи во овој граф постојат три темиња
кои немаат предходници (v2, v3, v4), се избира произволно теме од тоа
множество темиња. Нека тоа биде темето v4. Оваа постапка продолжува
се додека во резултантниот граф постојат темиња.

За да се овозможи компјутерско кодирање на овој алгоритам потребно е


да се избере соодветна репрезентација на податочната структура граф.
Репрезентацијата на потребните податочни структури се избира врз
основа на функциите кои треба да се извршат врз неа во текот на
реализацијата на алгоритмот (програмот). Во конкретниот случај со
анализата на општиот алгоритам лесно се утврдува дека
репрезентацијата на графот треба да овозможи: лесно утврдување дали
произволно теме од графот има предходник, лесно бришење на теме од

2
за интерна употреба

графот со сите негови излезни ребра. Делува дека второто барање е


најлесно остварливо доколку графот е претставен со помош на колекција
на листи од последователни темиња. За да го исполниме и првото
барање на алгоритмот, може стандардната репрезентација на графот со
помош на колекција на листи од соседни темиња да ја прошириме така
што во секој јазел водач ќе се памети и информација за влезниот степен
на дадениот јазел. Со секое отстранување на ребро кое води до
соодветно теме од графот, тој број опаѓа за еден. Во моментот кога тој
број ќе стане еднаков на нула, се добива теме кандидат за отстранување
од графот. Податочната репрезентација на почетниот граф од примерот
опишан во слика 11.2 е даден на слика 11.3

слика 11.2 Илустрација на алгоритмот за реализација на


тополошкото сортирање со помош на отстранување на темиња од
графот

3
за интерна употреба

слика 11.3 Податочна репрезентација на граф со мала модификација


на репрезентацијата со помош на колекција на листи на соседни
темиња

Алгоритмот кој следи ја користи податочната структура од слика 11.3


Темињата водачи на листите ги содржат полињата: COUNT (за
евиденција на влезниот степен на соодветното теме) и LINK (за врска
кон еден од соседите). Темињата од листата ги содржат полињата
VERTEX и LINK. Темињата чии листи на соседи содржат поле COUNT со
вредност нула се чуваат во магацин (но може и ред). Од алгоритмот се
гледа дека нема потреба од вистинско бришење на темињата од графот,
туку само од нивно изминување (при што соодветниот влезен степен се
намалува за еден), со што во праксата повторно се реализира соодветно
изминување на графот.

procedure TOPOLOGICAL__ORDER (COUNT, VERTEX, LINK, n)


// n teminja od GRAPH se sortirani vo topoloski redosled.
Grafot e reprezentiran kako mnozestvo od listi na sosedi so
COUNT (i) = the in-degree of vertex i//
1 top ← 0 //inicijalizacija na magacinot//
2 for i ← 1 to n do //kreiraj povrzan magacin od teminja koi nemaat predhodnici//
3 if COUNT(i) = 0 then [COUNT(i) ← top; top ← i]
4 end
5 for i ← 1 to n do //ispecati gi teminjata vo topoloski redosled//
6 if top = 0 then [print ('mrezata ima jamka'); stop]
7 j ← top; top ← COUNT (top); print (j) //izvadi go temeto od magacinot//
8 ptr ← LINK (j)
9 while ptr ≠ 0 do
//namali go brojot na teminja naslednici na j//
10 k ← VERTEX(ptr) //k e naslednik na j//
11 COUNT(k) ← COUNT(k) - 1 //namali go count//
12 if COUNT(k) = 0 //dodadi go temeto k vo magacinot//
13 then [COUNT(k) ← top; top ← k]
14 ptr ← LINK(ptr)
15 end
16 end
17 end TOPOLOGICAL_ORDER

4
за интерна употреба

11.2 Минимално распнувачко


стебло
(MINIMUM SPANNING TREE)
Бидејќи графот е комплексна структура, од корист е секоја
репрезентација која задржува дел од (не сите) неговите карактеристики.
Често пати од интерес е да се изведе стебло од даден граф така што тоа
ќе ги содржи сите темиња од графот и дел од ребрата во графот.
Пример за вакво стебло може да се добие при задржување на ребрата
низ кои се поминува со изминување по широчина на даден граф поради
тоа што во самата суштина на изминувањето е опфатена посета на сите
темиња од графот. Пример за еден комплетен граф и три негови стебла
претставници е даден на слика 11.4.

слика 11.4 Пример за комплетен граф и три можни распнувачки


стебла.

Од посебен интерес е изборот односно креирањето на распнувачко


стебло при што ребрата од графот кои се избрани да бидат гранки во
распнувачкото стебло задоволуваат некаков услов. Најчесто користен
услов кој овие ребра треба да го задоволуваат е тие да бидат
минимални. Бидејќи за да се поврзат N темиња, се потребни најмалку N-
1 ребро, постојат повеќе можни такви распнувачки стебла на даден граф.
Но доколку се работи за тежински графови, условот на минималност
може да се прошири односно да се дополни со барањето тежините на
ребрата кои влегуваат во распнувачкото стебло да имаат минимален
збир. Ова може да соодветствува со најмал вкупен пат кој поврзува
градови во некоја област, или најмало вкупно време за извршување на
проект и слично.

За даден неориентиран граф G = (V, E), каде ребрата дадени со (u, v)


E, имаат тежина (weight) w(u, v) минималното распнувачко стебло на
графот G е дадено со T E така што неговата вкупна тежина

w(T ) =  w(u, v)
( u ,v )T

5
за интерна употреба

е минимална. Фразата минимално распнувачко стебло односно


"minimum spanning tree" всушност треба да гласи минимално тежинско
распнувачко стебло односно "minimum-weight spanning tree."

Најпознати алгоритми за генерирање на минимални распнувачки стебла


се алгоритмите на Крускал (Kruskal) и Прим(Prim). Обата алгоритма
може да се реализираат да работат во време O(E lg V). Обата алгоритма
се претставници на максималистичкиот (алчен) пристап при реализација
на алгоритмите кој е валиден за конкретниот проблем.

Идејата на алчната стратегија при реализацијата на минимално


распнувачко стебло е во секој чекор да се избира ребро кое со додавање
во стеблото нема да го наруши предходно изграденото минимално
стебло. Ваквите ребра се нарекуваат безбедни(safe) ребра, па алчниот
архетип во основа може да се прикаже со следниот псевдо код.

GENERIC-MST(G, w)
1 A←
2 while A ne formira steblo pretstavnik
3 do najdi ja vrskata (u, v) koja e bezbedna za A
4 A←A {(u, v)}
5 return A

Од алгоритмот се гледа дека со ваквиот пристап, проблемот на градба


на минимално распнувачко стебло се сведува на проблем на наоѓање на
безбедно ребро во даден граф.

Алгоритмот на Крускал
Во пристапот (алгоритмот) на Крускал, минималното распнувачко стебло
се гради со вметнување на ребро по ребро. Ребрата кандидати за
вметнување во минималното распнувачко стебло се сите ребра кои се
споени со темињата на ребрата кои го сочинуваат стеблото. Ребрата кои
можат да се вметнат во предходно изграденото минимално стебло се
проверуваат според неопаѓачкиот редослед на нивните тежини.
Проверката на ребрата се сведува на проверка дали тоа ребро води кон
теме кое веќе постои во минималното распнувачко стебло. Доколку
темето кон кое тоа ребро води, не постои во минималното распнувачко
стебло, тоа ребро се вметнува во минималното распнувачко стебло.
Алгоритмот завршува кога сите темиња од графот ќе постојат во
стеблото, односно кога проверката ќе даде неповолен резултат за сите
кандидат ребра. Стеблото почнува да се гради со реброто од графот кое
има најмала тежина.

Пример за градење на минимално распнувачко стебло со овој алгоритам


е даден на слика 11.5. На слика 11.5а е даден почетниот граф, додека на
слика 11.5б е дадено неговото минимално распнувачко стебло. Ребрата
кои се кандидати за проверка на почеток се сите ребра од графот (2,3),
(2,4), (4,3), (2,6), (4,6), (1,2), (4,5), (1,5) и (5,6) сортирани во неопаѓаки
редослед според тежините 5, 6, 10, 11, 14, 16, 18, 19 и 33 соодветно.

6
за интерна употреба

Реброто (2,3) како ребро со најмала тежина се вметнува во минималното


распнувачко стебло. Бидејќи реброто (2,4) не е ребро кон истите темиња,
се вметнува и таа. Следно ребро за проверка е реброто (4,3). Но
бидејќитемето (3) веќе постои во стеблото, ова ребро не се вметнува.
Оваа постапка се повторува додека не се проверат сите ребра.

слика 11.5 Илустрација на алгоритмот на Крускал

Треба да се нагласи дека со примена на алгоритмот на Крускал


минималното стебло може да се добие и во последната итерација,
бидејќи особено во графови со поголем рој темиња, ребрата со најмали

7
за интерна употреба

тежини не мора да се однесуваат на темиња од ист регион. Ова е


илустрирано на слика 11.6. На таа слика се гледа дека всушност, со
примена на алгоритмот на Крускал, се гради шума од стебла која се
обединува со привршување на алгоритмот. Доказот дека алгоритмот е
коректен (односно дека максималистичкиот пристап е применлив) се
базира на теоријата на множества и дискретна математика.

8
за интерна употреба

слика 11.6 Илустрација на алгоритмот на Крускал за граф со повеќе


темиња

Псевдо кодот на основата на алгоритмот на Крускал е дадена во


продолжение. Од него се гледа дека од избраната репрезентација на
графот се бара ефикасно сортирање во неопаѓачки редослед и
ефикасно одстранување на темето кандидат доколку тоа не ги
задоволува условите. Бидејќи при heap сортирањето се добија слични
ефекти, се чини дека тоа е погодно за изведување, особено кога графот
е претставен преку три низи (две за темињата и една за тежините).

1 T←
2 while T pomalku od n - 1 vrski and E ne e prazno do
3 izberi vrska (v,w) od E so najmala cena;
4 izbrisi (v,w) od E;
5 if (v,w) ne sozdava jamka vo T
6 then dodadi (v,w) vo T
7 else otstrani (v,w)
8 end
9 if T sodrzi povekje od n - 1 vrski then print (' nema steblo pretstavnik ')

Алгоритмот на Прим
Алгоритмот на Прим се разликува од алгоритмот на Крускал затоа што
тој во секоја итерација гради едно стебло. Откако ќе се избере
произволно почетно теме, кон него се додаваат ребра од множеството
на ребра на темињата кои се споени со него. Во следните итерации се
разгледуваат сите ребра кои не припаѓаат на веќе изграденото стебло,
но излегуваат од темиња што припаѓаат на него. Реброто (односно
темето) што се придодава кон минималното распнувачко стебло е она
ребро што го задоволува условот да не се спојува со теме што веќе
припаѓа на минималното стебло (како кај Крускал) и има најмала тежина
(според максималистичкиот архетип). Графичка илустрација на овој
алгоритам е дадена на слика 11.7. Темињата (и ребрата) означени со
темна боја се темињата (и ребрата) кои во даден чекор влегуваат во
минималното распнувачко стебло. Во случај кога постои избор на повеќе
ребра со иста тежина кои би можеле да влезат во минималното
распнувачко стебло, изборот е произволен.

9
за интерна употреба

слика 11.7 Илустрација на алгоритмот на Прим за граф со повеќе


темиња

Псевдо кодот на овој алгоритам е даден во продолжение и во суштина


тој е сличен со алгоритмот за изминување по широчина. За секое теме v
се води вредност key[v] која ја означува тежината на реброто од неговиот
родител, кој се чува во [v], до него. На почетокот на алгоритмот сите
темиња се сместуваат во ред и соодветните тежински вредности им се
иницијализираат на бесконечна вредност. Тежината на почетното теме
што учествува во изградбата на минималното распнувачко стебло се
иницијализира на нула, додека информацијата за неговиот родител се
иницијализира на нулева вредност (поради тоа што тоа теме е корен на
минималното распнувачко стебло). Се додека постојат темиња во редот,
од него треба да се изберат темиња кои се „крајни“ темиња што веќе
припаѓаат во стеблото (линија 7 од псевдо кодот). Во првиот чекор тоа е
почетното теме. Во останатите чекори тоа се темиња кои имаат соседи
што не припаѓаат на стеблото. Се испитуваат сите соседи на тие темиња
(линија 8) кои веќе не биле вметнати во стеблото односно имаат реална
тежина (линија 9). Со оваа линија се оправдува иницијализацијата на

10
за интерна употреба

бесконечни вредности на тежините од линија 3. Доколку тежината е


најмала, се забележува предходникот, односно од кое теме е пристапено
до избраното теме (за да се зачува реброто) и се памети соодветната
тежина. Согласно линија 5, ова се прави се додека постојат темиња во
редот, односно додека не се креира целосно минимално поврзано
стебло. Се остава читателите сами да заклучат која репрезентација на
графот најмногу помага за реализација на овој алгоритам.

MST-PRIM(G, w, r)
1 Q ← V[G]
2 for sekoe u  Q
3 do key[u] ← ∞
4 key [r] ← 0
5 [r] ← NIL
6 while Q ≠ 
7 do u ← EXTRACT-MIN(Q)
8 for sekoe v  Adj[u]
9 do if v  Q and w (u, v) < key[v]
10 then [v] ← u
11 key[v] ← w(u, v)

11
за интерна употреба

11.3 Одредување на најкратки


патеки од дадено теме (SINGLE-
SOURCE SHORTEST PATHS)
Проблемот за потреба од одредување на најкратки патеки во граф е
очигледен. Еден пример за илустрација на овој проблем е како да се
стигне од местотo А до местото Б во некој регион во кој постои густа
патна мрежа. Очигледно дека еден пристап е да се одредат сите можни
патеки и да се избере најпогодната, но тоа би значело дека непотребно
ќе се изгуби време за да се пресмета на пример должината на патот од
Скопје за Дојран преку Охрид.

Проблемот на најкраток пат обично се третира преку тежински


ориентиран граф. Доколку тежините се со позитивни вредности, идејата
на овој тип алгоритми се содржи во идејата која се применува при
изминувањето на граф во широчина.

Пример за најкратки патеки во еден ориентиран граф е даден на слика


11.8. Се приметува дека не мора да постојат патеки до сите можни
темиња од графот. На пример, не постои патека до темето V5 поради
насоченоста на реброто (V5,V3).

слика 11.8 (a) Пример ориентиран тежински граф (б) најкратки


патеки до сите можни темиња од темето Vo

Во оваа тема ќе биде дискутиран проблемот на наоѓање на најкратки


патеки од едно теме до сите останати темиња во графот. Постојат и
други варијанти на темата најкратка патека (или пат) во граф.

Една варијанта би била наоѓање на најкратки патишта до теме кое е


дестинација во графот. Овој проблем може да се реши со едноставно
сменување на сите насоки во графот затоа што тогаш се трансформира
во наоѓање на најкраток пат од дадено теме до сите други.

12
за интерна употреба

Друг проблем е проблемот на наоѓање на најкратка патека помеѓу две


темиња што е специјален случај на алгоритмот за наоѓање на најкратка
патека до сите темиња од дадено теме. Интересно е да се забележи
дека сеуште не е познат алгоритам кој за решение на овој проблем во
најлош случај работи побрзо од најдобрите алгоритми за наоѓање на
најкраток пат до сите темиња од дадено теме.

Конечно и наоѓањето на најкратките патеки помеѓу сите парови темиња


во графот. Иако овој проблем може да се реши со изведување на
алгоритмот за најкраток пат од дадено теме до сите останати темиња, за
сите темиња во графот, постојат и поефикасни решенија за овој
проблем, но тие нема да бидат разгледувани во рамките на овој курс.

Некои алгоритми за наоѓање на најкратки патеки претпоставуваат дека


сите тежини на ребрата се ненегативни, односно нулеви или позитивни.
Таков е алгоритамот на Дајкстра (Dijkstra). Други алгоритми можат да го
најдат најкраткиот пат во некои случаи дури и кога тежините се
негативни. Пример за таков алгоритам е алгоритамот на Белман и Форд
(Bellman-Ford). Во рамките на оваа тема ќе биде обработен само
алгоритмот на Дајкстра.

Најкратките патеки од дадено теме до секое теме во еден граф обично


се претставуваат преку стебло на најкратки патеки. Траба да се нагласи
дека не мора да постои единствен најкраток пат, односно единствено
стебло на најкратки патеки. Примерот на слика 11.9 претставува еден
насочен тежински граф за кој постојат две различни стебла на најкратки
патеки. Гранките на стеблата со најкратки патеки се означени со
затемнети линии. Лесно се проверува дека должините на патеките до
секое теме во графот се исти во двете стебла.

слика 11.9 (a) Насочен тежински граф (б) Пример стебло на


најкратки патеки од јазелот 0 (в) Различно стебло на најкратки
патеки од истиот јазел

За даден граф G, може да се претпостави дека множеството на темиња


до кои е одреден најкраткиот пат (вклучувајќи го тука и појдовното теме)
е S. За секое теме w кое припаѓа на S, со d(w) може да се означи
моменталната должина на најкраткиот пат од појдовното теме до w при
тоа движејќи се само преку темињата кои се во S. Тогаш и патеките до
сите соседни темиња на темињата кои припаѓаат на S мора да
поминуваат преку темиња кои се во S. Во спротивното, би постоел пат на

13
за интерна употреба

теме од S кој не би бил најкраток, а според претпоставката тие патишта


се веќе одредени (темињата затоа се во S). Од тука следи дека и
најкратката патека до некое теме кое не е во S е еднаква на минимумот
од збировите на најкратките патеки до темињата во S со должината на
патеката од нив до темето кое се разгледува. Од тука следи дека
архетипот на алчни алгоритми работи за генерирање на стебло на
најкратки патеки.

Иницијализацијата на моменталните должини на најкратките патеки за


сите темиња на почетокот од алгоритмот се реализира преку
доделување на бесконечна вредност како естимирана вредност за сите
темиња, освен појдовното (кое има пат до себе со тежина 0).
Дополнително во фазата на иницијализација може да се постави
предходникот на секое теме (од аспект на предходник во резултантното
стебло на најкратки патеки) на нулева вредност. Овие вредности ќе се
ажурираат во текот на извршувањето на алгоритмот, слично како кај
алгоритмот за изминување на граф по широчина.

INITIALIZE-SINGLE-SOURCE(G,s)
1 for sekoe teme v  V[G]
2 do d[v] ← ∞
3 [v] ← NIL
4 d[s] ← 0

По иницијализацијата, [v] = NIL за секое v V, d[v] = 0 за v = s, и d[v] = ∞


за v V - {s}.

Релаксацијата на естимираната тежина всушност е проверка дали таа


може да се намали и намалување доколку е тоа можно. При тоа, доколку
се намали естимираната вредност за должината на патеката, потребно е
да се ажурира и вредноста за предходникот на темето во стеблото на
најкратки патеки. Тоа е претставено со следниот псевдо код.

RELAX(u, v, w)
1 if d[v] > d[u] + w(u,v)
2 then d[v] ← d[u] + w(u,v)
3 [v] ← u

Алгоритам на Дајкстра
Алгоритмот на Дајкстра работи под претпоставка дека за даден тежински
ориентиран граф G = (V, E) за секое ребро (u, v) E важи дека нејзината
тежина w(u, v) 0.

Овој алгоритам работи со множество на темиња S до кои е одреден


најкраткиот пат од појдовното теме s. Поради тоа за секое теме v S,
важи d[v] = (s, v) односно d[v] е бараната тежина на најкраткиот пат.
Алгоритмот на Дајкстра ги селектира темињата u V - S така што тие
имаат најмал естимиран пат до s, ги вметнува нив во S и ги релаксира
сите ребра кои излегуваат од u. Во следниот псевдо код темињата кои не

14
за интерна употреба

се во S, се чуваат во редот Q заедно со нивните естимирани d


вредности.

DIJKSTRA(G,w,s)
1 INITIALIZE-SINGLE-SOURCE (G,s)
2 S←
3 Q ← V[G]
4 while Q ≠ 
5 do u ← EXTRACT-MIN(Q)
6 S←S {u}
7 for sekoe teme v  Adj[u]
8 do RELAX (u,v,w)
Илустрацијата на овој алгоритам за даден граф, е прикажана на слика
11.10. Појдовното теме е најлевото теме од графот. Во темињата се
означени тековните претпоставени најкратки должини на патеките,
додека со темна боја се означени ребрата кои се кон моменталните
предходници (кои го сочинуваат моменталното стебло на најкратки
патеки). Темињата кои припаѓаат на S се означени со темна боја. Темето
означено со сива боја е темето кое е одередено како избрано во линија 5
од псевдо кодот. На слика 11.10а е претставена ситуацијата после
иницијализацијата, додека останатите слики соодветствуваат со
ситуациите после секоја итерација на циклусот од линиите 4 до 8. Слика
11.10ѓ го претставува излезот на алгоритмот.

слика 11.10 Илустрација на алгоритмот на Дајкстра за граф со


повеќе темиња

Треба да се нагласи дека поради тоа што во редот се наоѓаат сите


темиња од графот, кои се вадат и се обработуваат, циклусот се
извршува V пати. Во принцип EXTRACT-MIN може да се изврши во O(V)
време, а бидејќи таа операција се извршува V пати (поради тоа што
толку елементи има во редот Q), вкупниот придонес на таа операција е
O(V2). Секое теме се обработува само еднаш при што се третираат сите
негови излезни ребра (линии 7 и 8 од алгоритмот) од што следи дека се

15
за интерна употреба

третираат сите излезни ребра од сите темиња, односно сите ребра во


графот. Од тука следи дека for јамката се извршува E пати односно
целиот алгоритам се извршува со временска комплексност O(V2 + E).
Бидејќи бројот на ребрата во еден граф е обично помал од бројот на
темиња, можеме да кажеме дека временската комплексност на
алгоритмот на Дајкстра е O(V2).

16

You might also like