You are on page 1of 21

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

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


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

10. Графови

10.1. Потреба и примена од


генерална податочна структура
Неформално граф претставува множество на темиња кои се поврзани на
некаков начин. Во визуелната репрезентација на графот, темињата
(често се користат и синонимите: јазли, точки - vertices) се означуваат со
кругови, додека ребрата (врските, рабовите, лаковите - edges) помеѓу
нив се означуваат со линии кои ги поврзуваат соодветните темиња. При
тоа може да се забележи дека едно ребро е одредено со пар на темиња.
Така, графот даден на слика 10.1 е составен од множеството темиња:
{1,2,3,4,5} и множеството ребра: {(1,2), (2,5), (5,4), (1,5)}.

слика 10.1 Визуелна репрезентација на еден граф

Многу проблеми во практиката на природен начин се претставуваат во


форма на точки и линии што ги поврзуваат, т.е. во форма на графови.

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


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

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

Историски гледано, за почетокот на развојот на теоријата на графови се


смета Ојлеровата дискусија за проблемот на поминувањето на 7-те
мостови на реката Прегол во градот Кенигсберг (денешен Калининград)
публикувана во 1736 година. Дискусијата го разгледува проблемот “Дали
е можно при прошетката низ паркот прикажан на слика 10.2 да се помине
преку секој од мостовите точно по еднаш? Хамилтон и Киркман во 1856
дискутирале проблеми на патувања при коишто некои градови би се
поминувале само еднаш. Токму од таквите тополошки и навигациски
проблеми се родила теоријата на графови.

слика 10.2 Мостовите на паркот во Konigsburg (Калининград)

Варијација на предходните проблеми е претставена преку проблемот на


трговскиот патник (Travel Salesman Problem - TSP) кој се однесува на
одредено множество на градови во даден географски простор (на
пример градовите од слика 10.3) и треба да се пронајде најевтиниот
начин да се поминат сите градови ако се дадени цените на транспорт
помеѓу градовите. Доколку градовите се базни станици, а цената е
еднакво на растојанието, решението на проблемот нуди решение и на
телекомуникациски проблеми. Слични аналогии постојат и во сите
проблеми од реалниот живот поврзани со топологијата. Такви проблеми
се јавуваат речиси во сите области на човековата дејност: во
транспортот, во комуникациите, во планирањето на проекти и ресурси,
во сообраќајот, во мрежните шеми во електротехниката, во сегментација
на програми во информатиката, во структурата на молекулите и атомите
во биологијата и хемијата итн.

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

слика 10.3 Репрезентација на тополошки проблеми со графови

Познатиот швајцарски математичар Ојлер (Euler), ги разгледувал


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

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

Прашањето кое дава одговор на прашањето „Дали е можно коњот да ја


измине целата шаховска табла и при тоа да го посети секое поле точно
по еднаш?“ е исто така прашање за чие решение може да се користи
теоријата на графови (особено кога е дозолена произволна големина и
форма на таблата). Соодветната формулација на ова прашање во
теоријата на графови би била: “Постои ли патека низ графот која ги
посетува темињата точно по еднаш?” Ваквата патека, доколку постои се
нарекува Хамилтонски циклус (Hamiltonian cycle).

Посебна класа на проблеми кои може да се решат со помош на


теоријата на графови се проблемите кои се сведуваат на проблемот на
боење на географска карта. На колку начини и под кои услови со
користење на најмал број на бои можат да се обојат земјите од некој
реон дадени со географска карта така што ниедни две соседни земји
нема да бидат обоени со исти бои. Кога ќе се репрезентира со помош на
теоријата на графови, земјите можат да се претстават со темиња, додека
границите кои ги делат се ребрата меѓу нив. Тогаш проблемот се
сведува, кој е најмалиот број симболи со кои можат да се означат
темињата во еден граф, така да соседни темиња не се означени со исти
симболи. Доколку темињата претставуваат пристапни точки на безжична
мрежа, а симболите фрекфенции со кои тие работат, тогаш решението

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

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


со безжична мрежа без настанување на интерференција меѓу сигналите.

Графовите ги опишуваат врските помеѓу објектите. Тие, како и други


математички поими, може да се дефинираат преку поимите множество и
релација.

10.2 Дефиниции на својствата на


графовите
Формалната дефиниција на графот вели дека графот G е непразно
множество V заедно со релација E, дефинирана на множеството V.

Граф G се дефинира како двојка (V, E), каде што V е множество темиња,
а E е множество ребра при што на секое ребро е придружен пар темиња
преку така наречената функција на соседство E → V×V. Темињата u и v
во реброто e = (u, v)  E, се нарекуваат краеви на реброто. Доколку
двојките на темињата се разгледуваат како неподредени, т.е. кога (u, v) =
(v, u), графот се нарекува неориентиран. Кога ребрата на графот се
разгледуваат како подредени двојки, т.е. кога (u, v) ≠ (v, u), графот се
нарекува ориентиран граф или орграф. Тогаш ребрата ги нарекуваме
ориентирани ребра. Во случај на ориентиран граф, темето u во реброто
(u, v) се нарекува почеток, а темето v крај на реброто.

Дефиницијата на графот дозволува графот да има повеќе ребра со


еднакви краеви, т.е. да има ребра со исти почетоци и краеви. За таквите
ребра велиме дека се паралелни. Ребрата од обликот (v, v) ги
нарекуваме јамки (лупи).
Графовите во рамнината или просторот се претставуваат графички така
што темињата се претставуваат со точки (или некои други геометриски
облици), а ребрата со линии што ги поврзуваат точките. На слика 10.5 се
прикажани еден граф со јамка и паралелни ребра и еден орграф.

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

слика 10.5 Графички репрезентации на


а) неориентиран и б) ориентиран граф

На секој ориентиран граф (орграф) може да му се придружи соодветен


неориентиран граф што се добива со претворањето на ориентираните
ребра во неориентирани ребра. Важи и обратното, односно на секој
неориентиран граф може да му се придружи соодветен ориентиран граф
каде што секое ребро (u, v) се заменува со пар ребра (u, v) и (v, u). На
слика 10.6 се прикажани примери на вака добиени графови.

Графот G = (V, E), се нарекува прост граф, ако E не содржи јамки и


паралелни ребра. Во случај на прост граф, постои само едно ребро со
краеви u и v, или ако графот е ориентиран, само едно ребро со почеток u
и крај v.

слика 10.6 Придружување: орграф во граф и граф во орграф

Парот темиња (u, v) што соодветствува на краевите на едно ребро се


нарекуваат соседни темиња и тогаш обично велиме дека реброто ги
спојува темињата u и v или оди од темето u до (во) темето v.

Во реброто (u, v) за случај на ориентиран граф, темето u се нарекува


претходник на темето v, а темето v се нарекува следбеник на темето u.
Темето што не е крај или почеток на ниту едно ребро се нарекува
изолирано теме, додека темето соседно на само едно теме се нарекува
висечко теме.

Бројот на ребра d(v), чијшто крај е во темето v, се нарекува степен или


валентност на v. Кај ориентираните графови бројот на ребра со почеток
во v се нарекува степен на излез, а бројот на ребра со крај во v се
нарекува степен на влез.

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

За простите графови јасни се следниве равенства:

 d (v )  2  V
vV
и d
vV
iz (v )  d vl (v )  V

каде што diz() и dvl() се степените на излез и влез, а |V| е бројот на


темиња во графот.

Во практиката, многу често се сретнуваат графови при кои на секое


ребро е придружен реален број што може да претставува: тежина,
растојание, цена, проточност, профит итн. Таквите графови се
нарекуваат тежински графови. На слика 10.7 се прикажани примери на
прост (а) и тежински граф(б).

слика 10.7 а) прост граф, б) тежински граф

Броевите на темињата и ребрата во графот G = (V, E) ќе ги означуваме


со |V| и |E| соодветно. Сите дискусии за графовите во рамките на оваа
тема се однесуваат само на конечните графови, т.е. на графовите каде
што множествата V и E се конечни (|V|, |E| < ∞).
Подграф G' = (V', E'), на графот G = (V, E), е граф чиешто множество
темиња и ребра се подмножества на оние во G, т.е. важи V'V и E'E.
Ако G' е подграф на G, тогаш за секое ребро (u', v')E', нејзините крајни
темиња мора да се во V', т.е. u', v’ V'.

10.3 Репрезентации на графовите


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

Матрица на соседство
Матрицата на соседство е веројатно најчесто користениот начин на
претставување на графовите. Матрицата на соседство е матрица A = [ai,j]
од ред |V|×|V| каде што ai,j=1 ако имаме ребро од темето vi до темето vj,
т.е. ако (vi, vj)E и ai,j=0 во спротивниот случај. Кај неориентираните
графови матрицата на соседство е симетрична, па е доволно да се
чуваат само елементите од горниот триаголник. Графовите од сл. 10.5а
и 10.5б се претставуваат со следниве матрици:

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

0 1 0 0 0 0 1 0 0 0
1 0 1 1 1 0 0 0 1 0
   
Aa  0 1 0 2 0 , Aб  0 1 0 2 0
   
0 1 2 0 1 0 0 0 0 1
0 1 0 1 1 0 1 0 0 1

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


се претстават со броеви поголеми од 1, што не е секогаш пожелно
бидејќи тоа ја нарушува бинарноста на матрицата. Јамките се
претставуваат со единици во главната дијагонала.

Кога графот е со тежински ребра, бројот ai,j е тежина на реброто (vi, vj).
Оваа тежина обично претставува растојание, цена на чинење или
профит. Доколку тежината може да има вредност „0“ треба да се воведе
некоја друга ознака за непостоечките ребра, на пример ai,j = ∞ или ai,j =
−∞, за да се разликува реброто со тежина 0 од непостоење на ребро. Во
случај на тежински граф, паралелните ребра не можат соодветно да се
прикажат. Тежинскиот граф од слика 10.7б, може да се претстави со
следнава матрица:

 2    
2  8 7 1 

Ar   8  0;6  ,
 
 7 0;6  2 
 1  2 16
Меморискиот простор кој треба да се искористи при репрезентацијата на
графот со n темиња со помош на матрица на соседство е n2. При
реализација на претстава на граф со матрици на соседност пристапот до
елементите е директен.

Листа на соседство
Листата на соседи за темето i е листа во која се наредени сите соседни
темиња за темето i, H[i]. За секое од темињата на графот се чува листа
во која секој од елементите претставува едно соседно теме. На сликата
10.8 е даден еден граф и неговата претстава со листа на соседи.

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

слика 10.8 Репрезентација на граф преку колекција на листа од


соседи

Меморискиот простор потребен за оваа структура е пропорционален на


бројот на темиња собран со бројот на ребра и во секој случај е помал од
n2. Пристапот до елементите од графот не е директен и за да се утврди
дали темето j е сосед на темето i мора секвенцијално да се пребара
една листа.

Список на ребра
Список на ребра е низа двојки темиња (u, v), u,vV што ги претставуваат
ребрата на графот. За графот од слика 10.5б (може да важи и за слика
10.5а), списокот на ребра е: (1, 2), (2,4), (3, 2), (3, 4), (3, 4), (4, 5), (5, 2),
(5, 5), каде што темињата се претставени со своите индекси. Во пракса
обично се користат две низи, едната за почетоците на ребрата, а другата
за краевите. Во тој случај би ги имале следниве две низи:

p = (1, 2, 3, 3, 3, 4, 5, 5)
q = (2, 4, 2, 4, 4, 5, 2, 5)

Списокот на ребра е економичен начин на претставување на даден граф,


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

Јамките и паралелните ребра се претставуваат едноставно со оваа


репрезентација, поради тоа постои внес за секоје ребро. Изолираните
темиња исто така можат да се претстават на едноставен начин. На
пример, тие можат да се стават во p при што соодветниот пар во q би
бил 0. Тежинските графови се претставуваат со воведување уште една
низа t со тежините на соодветните ребра. За графот од сликата 10.7б,
низата t е t = (2, 7, 8, 0, 6, 2, 1, 16).

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

Структура на инцидентност (соседност)


Суштината кај претставувањето на графот со неговата структура на
инцидентност е за секое теме во графот да се даде листа на темињата,
негови „следбеници”, т.е. за секое теме v се дава листа на темињата w
такви што
(v, w)E. Оваа листа ќе ја означуваме со функцијата SL(v).

Сосема слично, наместо листа на “следбеници” може да се даде листа


на „претходници”, т.е. за секое теме v да се даде листа на темињата u
такви што (u,v)E. Ваквата листа ќе ја означуваме со функцијата PR(v).
За графовите од слика 10.5а и слика 10.5б каде што темињата се
претставени со своите индекси таквата структура е прикажана на слика
10.9.

V SL(v) v PR(v) v SL(v) v PR(v)


1: 2 1: 2 1: 2 1:
2: 1,3,4,5 2: 1,3,4,5 2: 4 2: 1,3,5
3: 2,4,4 3: 2,4,4 3: 2,4,4 3:
4: 2,3,3,5 4: 2,3,3,5 4: 5 4: 2,3,3
5: 2,4,5 5: 2,4,5 5: 2,5 5: 4,5

слика 10.9 Претстава на граф со структура на инцидентност


(соседност)

Да забележиме дека паралелните ребра се претставуваат едноставно со


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

Основниот проблем во овој начин на претставување е што листите на


следбениците или претходниците се со променлива должина. Така, се
чини дека линеарната структура - листа е погодна за чување на
следбениците и претходниците и како таква е погодна за алгоритми што
во графот додаваат или бришат темиња. За претставување тежински
графови, потребно е воведување на дополнителни листи со тежини.

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

10.4 Маршути во граф


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

vi0 , e j1 , vi1 , e j2 , vi3 ,..., vin1 , e jn , vin


каде што e jk  (vik 1 , vik ) за k=1, 2,..., n.

Маршута е едноставно конечна низа на темиња и соседни ребра. Ако


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

Првото теме во маршутата е почеток, а последното теме е крај на


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

Маршута во која сите темиња се различни ќе ја нарекуваме пат или


патека. Доколку првото и последното теме од патеката се еднакви тогаш
станува збор за затворен пат или циклус.

Секој пат е верига, а секоја верига е маршута. Секој пат е верига бидејќи
ако не се поминува два пати низ исто теме не е можно да се помине два
пати по исто ребро.

На пример, следниве поминувања на графот прикажан на слика 10.5а ги


илустрира овие поими
v3, e3, v4, e2, v2, e2, v4, e7, v5, e8, v5, e6, v2 е маршута,
v3, e4, v4, e7, v5, e8, v5, e6, v2, e2, v3, e4, v4 е верига,
v3, e3, v4, e7, v5, e6, v2, e1, v1 е пат,

додека истите поими за ориентираниот граф на сл. 10.5б се илустрирани


со следниве примери
v3, e3, v4, e7, v5, e8, v5, e8, v5, e6, v2, e5, v4 е маршута,
v3, e3, v4, e7, v5, e8, v5, e6, v2, e5, v4 е верига,
v3, e4, v4, e7, v5, e6, v2 е пат.

Лесно може да се докаже дека постоење на отворена или затворена


маршута, верига или пат од едно теме vi до друго теме vj во еден граф G
се еквивалентни тврдења. Ако во таков случај ставиме vi≡vj,
праволиниски се докажува дека релацијата е релација на
еквивалентност над V. Оваа релација на еквивалентност го дели
множеството темиња во графот на класи на еквивалентност, т.е.
подмножества темиња меѓу кои постои пат. Овие подмножества се
нарекуваат сврзани компоненти на графот G.

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

Неориентираниот граф G е сврзан ако има точно една сврзана


компонента, т.е. ако било кои две темиња се поврзани со пат.
Ориентираниот граф G може да се смета за сврзан (поточно слабо
сврзан) ако соодветниот неориентиран граф е сврзан. За многу
практични проблеми доволно е да се разгледуваат само сврзани
графови. Сврзаноста на графовите веднаш се забележува. Такви се, на
пример, сите графови од сликите 10.5.

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


сврзаност што означува дека постои пат меѓу било кој пар темиња. На
пример, графот од слика 10.5б е сврзан, но не е силно сврзан бидејќи,
на пример, не постои пат од темето v2 до темето v3. Од друга страна,
ориентиран граф секогаш може да се разложи на силно сврзани делови
(компоненти). За графот од слика 10.5б, силно сврзаните компоненти се:
{v1}, {v2,v4, v5} и {v3}.

Кога постои пат од темето u до темето v во еден орграф, за темето u


велиме дека е предок на темето v, а за темето v велиме дека е потомок
на темето u.

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

10.5 Некои типови графови


Наједноставни графови се оние графови што немаат ребра. Еден од
наједноставните типови графови се комплетните графови. Тоа се
графови без паралелни ребра, а секој пар темиња е поврзан со ребро.
На слика 10.10 се прикажани комплетниот ориентиран и неориентиран
граф со четири темиња.

слика 10.10 а) Комплетен неориентиран 4-граф, б) Комплетен


ориентиран 4-граф

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

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


се еднакви. Попрецизно, графот G=(V, E) е k-регуларен ако d(v) = k, за
секое теме vV.
На слика 10.11 се прикажани еден 2-регуларен и еден 3-регуларен граф.

слика 10.11 Регуларни графови

Графовите чиишто темиња се поделени во две дисјунктни множества и


каде што ребрата поврзуваат темиња само од различните множества се
нарекуваат бипартитни графови. Бипартитноста на графовите обично не
може веднаш да се забележи од цртежот на графот, а уште помалку од
некое негово претставување. (види слика 10.12). Во таа слика
дисјунктните множества темиња се дадени во два реда (првиот и третиот
случај) односно како два квадрата (вториот случај). Кога треба да се
нагласи дека графот е бипартитен, обично се пишува G = (V1(∪V2, E),
каде што V1 и V2 се соодветно, темињата од едниот и другиот дел на графот.

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

слика 10.12 Дводелни графови

слика 10.13 Примери за стебла

Стеблата претставуваат специјален случај на графовите. Сврзаните


графови што немаат циклус (затворен пат) се нарекуваат стебла. На
слика 10.13 се прикажани 4 стебла, две со 4 темиња и две со 6 темиња.

Графовите кај коишто некои темиња се издвоени се нарекуваат мрежи.


Издвоените темиња (само влезови или излези) најчесто се нарекуваат
полови. На пример, стеблата може да се сметаат за мрежи со еден пол,
коренот на стеблото. Од најголем практичен интерес се мрежите со два
пола (види слика 10.14). Во најголем број случаи мрежите се
ориентирани и тежински.

слика 10.14 Ориентирана тежинска мрежа со два пола

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


поделени во k множества Vi, i=1,2,...,k, при што k ≥ 2 , додека ребрата ги
13
за интерна употреба

поврзуваат само темињата на соседните множества. Така, ако (u, v) е


ребро, имаме дека uVi и vVi+1. Додатно, множествата V1 и Vk имаат
само по еден елемент s и t респективно (како кај мрежите).
Повеќестепенските графови се обично тежински. На слика 10.15 е
прикажан пример на четиристепенски граф.

слика 10.15 Четиристепенски граф

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


претставен во рамнината така што ребрата претставени со произволни
линии немаат пресек (освен во темињата). На слика 10.16 се прикажани
еден непланарен и еден планарен граф.

слика 10.16 а) Непланарен граф, б) Планарен граф

Постојат многу примери на конкретни графови од специфичен интерес.


Како пример за еден таков граф е така наречениот Петерсонов граф
претставен на слика 10.17. Петерсоновиот граф е 3-регуларен граф со
10 темиња и 15 ребра. Тој е познат по тоа што е контрапример за многу
претпоставки во теоријата на графови. Општо земено, тоа значи дека
претпоставките за некое тврдење што се чини валидно за сите графови,
најпрво би било пожелно да се провери на Петерсоновиот граф.

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

слика 10.17 Петерсонов граф

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

10.4 Изминувањe на графовите


Како и кај останатите податочни структури, еден од основните алгоритми
кои треба да се реализираат кај графовите е алгоритмот за
пребарување, односно изминување. Проблемот на изминување се
сведува на реализација на систематска посета на сите темиња во
графот. Кај графовите постојат две генерални стратегии за
пребарување: пребарување по длабочина (Depth First Search) и
пребарување по широчина (Breadth First Search).

Пребарување по длабочина (Depth First Search)

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


посета на произволно почетно теме v. Потоа се посетува соседно,
предходно непосетено теме w и постапката се повторува се додека не се
дојде до теме u такво што за него не постојат непосетени соседни
темиња. Тогаш се „враќаме“ на предходно посетено теме кое сеуште има
непосетени соседи. Постапката се повторува се додека не се изминат
сите темиња од графот. Принципиелната рекурзивна процедура за ова
изминување може да се претстави со следниот код:

procedure DFS(v)
//Za daden neorientiran graf G = (V,E) so n teminja i niza
VlSlTED(n) inicijalno postavena na nula, ovoj algoritam ke gi poseti site teminja dostapni od
temeto v. G i VISITED se globalni.//

VISITED (v) 1
for sekoe teme w sosedno na v do begin
if VISlTED(w) = 0 then call DFS(w)
end
end DFS

Временската комплексност на реализацијата на овој алгоритам во


принцип зависи од изборот на начинот на репрезентација на графот и во
најефикасен случај има линеарна комплексност во однос на бројот на
ребра, но не ја надминува комплексноста O(n2).

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


посетените темиња од графот. Така, секогаш кога темето v е посетено
при проверка на соседите на веќе посетеното теме u, пребарувањето по
длабочина го запаметува тој настан така што на предходникот на темето
v означен со [v] му ја доделува вредноста u.

Дополнително, темињата при реализацијата на пребарувањето се „бојат“


со цел да се означи нивната состојба. Секое теме на почетокот на
пребарувањето е бело, при неговото посетување станува сиво и
поцрнува откако ќе се посетат сите негови соседи. На овој начин се
обезбедува само едно изминување на едно теме во графот.

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

Пребарувањето во длабочина во принцип може да води и две временски


марки (timestamp) за секое теме, кои ги означуваат времињата: кога
темето v е првпат „откирено“ односно обоено во сиво - d[v] и кога
алгоритмот ги проверил сите темиња на темето v и го обоил темето во
црно - f[v]. Овие временски марки се цели броеви. За секое теме u важи
d[u] < f[u].

Темето u е бело (WHITE) пред времето d[u], сиво (GRAY) во интервалот


помеѓу времињата d[u] и f[u] и конечно црно (BLACK) по времето f[u].

Псевдо кодот даден во продолжение претставува поточна реализација


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

DFS(G)
1 for sekoe teme u  V[G]
2 do color[u] ← WHITE
3 [u] ← NIL
4 time ← 0
5 for sekoe teme u  V[G]
6 do if color[u] = WHITE
7 then DFS-VISIT(u)

DFS-Visit(u)
1 color[u] ← GRAY  pronajdeno e belo teme u
2 d[u] ← time← time + 1
3 for sekoe v  Adj[u]  proveri ja vrskata (u,v)
4 do if color[v] = WHITE
5 then [v] ← u
6 DFS-Visit(v)
7 color[u] = BLACK  crno u; zavrseno e
8 f[u] ← time← time + 1

Линиите од 1 до 3 во процедурата DFS ги иницијализираат состојбите на


сите темиња во графот на бело и пополнуваат нулеви вредности за
нивните предходници. Линијата 4 го ресетира времето кое ќе ни служи за
доделување на временски марки. Линните од 5 до 7 го проверуваат
секое теме од графот и доколку тоа не е ниту еднаш посетено го
посетуваат со повик на процедурата DFS-VISIT.

При секој повик на DFS-VISIT(u) во линија 7, темето u станува почеток на


ново пребарување и неговата боја е бела. Во линија 1 на таа процедура,
бојата на темето u станува сива, додека во линија 2 се сочувува
соодветната временска марка со помош на инкрементирање на
глобалната временска променлива. Линиите од 3 до 6 рекурзивно ги
проверуваат сите соседи на тековното теме и ги посетуваат доколку тие
се бели. Откако ќе бидат проверени сите соседи, линиите 7 и 8 го бојат
темето u во црно и му ја доделуваат втората временска марка.

Илустрација на процесот на пребарување по длабочина со илустрација


на боите кои темињата ги добиваат во процесот на пребарување и

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

временските марки дадени со броеви во темињата на графот, за даден


граф е прикажана на слика 10.18.

слика 10.18 Илустрација на процесот на пребарување по длабочина

Пребарување по широчина (Breadth-first search)

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


релативно едноставен алгоритам па поради тоа претставува основа за
многу други алгоритми кои работат со графови. Како примери за
алгоритми кои ќе бидат обработени во продолжение на темата, а кои во
основа го користат ова пребарување се алгоритмот на Дајкстра за
наоѓање на најкраток пат (Dijkstra's single-source shortest-paths algorithm)
и алгоритмот на Прим за генерирање на минимално распнувачко стебло
(Prim's minimum-spanning-tree algorithm).

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


растојание k+1 од почетното теме се додека не ги посети сите темиња
што се на растојание k.

За даден граф G и почетно теме s, алгоритмот за пребарување по


широчина ги испитува сите ребра на темето s за да ги открие сите
темиња до кои може да се достапи од тоа теме. Алгоритмот ги
пресметува растојанијата на темињата (најмалиот бројот на ребра) од
18
за интерна употреба

темето s. Тој исто така создава стебло "breadth-first tree" со корен


претставен преку темето s кое ги содржи сите темиња до кои може да се
достапи од тоа теме (дирекно или преку неговите соседи). За секое теме
од графот патот на тоа теме до коренот на така создаденото стебло е
еднаков на најкраткиот пат на тоа теме до темето s во графот G.
Алгоритмот работи и на ориентирани и на неориентирани графови.

Алгоритмот за пребарување по широчина ги маркира темињата во една


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

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


широчина е даден во продолжение. Процедурата BFS ја користи
репрезентацијата на графот со листи на соседство. Бојата на секое теме
се чува во низата color[u], додека предходниците се чуваат во низата
[u]. Доколку темето нема предходник (или се уште не е откриено) важи
[u] = NIL. Растојанието од почетното теме на пребарување за секое теме
u се чува во низата d[u]. Алгоритмот користи податочен тип редица Q
(first-in, first-out queue) за да ги чува сивите темиња.

BFS(G,s)
1 for ekoe teme u  V[G] - {s}
2 do color[u] ← WHITE
3 d[u] ← ∞
4 [u] ← NIL
5 color[s] ← GRAY
6 d[s] ← 0
7  [s] ← NIL
8 Q ← {s}
9 while Q ≠ 
10 do u ← head[Q]
11 for sekoe v  Adj[u]
12 do if color[v] = WHITE
13 then color[v] ← GRAY
14 d[v] ← d[u] + 1
15  [v] ← u
16 ENQUEUE(Q,v)
17 DEQUEUE(Q)
18 color[u] ← BLACK

Линиите од 1 до 4 ги иницијализираат боите на темињата на бела, го


поставуваат растојанието на сите темиња до почетното теме на
пребарувањето на бесконечна вредност и го иницијализираат
предходникот на секое теме на нулева вредност. Линијата 5 го бои
почетниот јазол на пребарувањето во сиво. Линијата 6 го иницијализира
растојанието d[s] со 0. Линијата 7 потврдува дека неговиот предходник е
нулев (поради фактот што е тоа првиот јазел во пребарувањето).
Линијата 6 го иницијализира редот ставајќи го во него сивиот јазел s.

Главниот циклус на алгоритмот е реализиран со линиите од 9 до 18.


Циклусот врти се додека постојат сиви темиња. Линијата 10 го зема
сивото теме од почетокот на листата. Циклусот од линиите 11-16 го

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

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


врвот на редот. Ако при таа проверка се дојде до бело теме, се
извршуваат линиите од 13 до 16, односно темето станува сиво,
растојанието d[v] се сетира на d[u] + 1 и темето u (кое е добиено од
редицата и чии соседи се анализираат) се поставува како предходник на
темето v. Потоа темето v се поставува на крајот на редицата. Кога сите
соседи на темето u (кое е добиено од врвот на редот) се испитани на тој
начин, темето u се отстранува од редот и станува црно (линии 17-18).

Илустрација на процесот на пребарување по широчина за даден граф со


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

слика 10.19 Илустрација на процесот на пребарување по широчина

Бидејќи со проверката во линија 12, секое теме се сместува во редот


само еднаш, а за секое теме од редот исто така само еднаш се

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

проверува листата на соседи, алгоритмот има линеарна зависност од


збирот на темињата и ребрата во графот.

21

You might also like