You are on page 1of 15

Графови во С++

 Графовите се математички структури кои ја рефлектираат во пар врската помеѓу


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

 Графовите наоѓаат многу голема употреба во голем број на апликации што


секојдневно ги користиме.
 Еве и неколку примери:
 Google maps
 Социјални мрежи
 Интернет пребарувачи итн.
Типови на графови

 Ненасочени графови:Сите ребра во ненасочен граф се двонасочни и не се


насочени во некоја одредена насока.
Пример за ненасочен граф:
 Насочени графови: Во насочен граф, сите ребра се еднонасочни тие се
насочени во една насока.
Пример за насочен граф:
 Графови каде што за секое ребро е дефиниран и одреден реален број кој ја
означува неговата тежина, растојание, или некоја друга слична мерка, се
нарекуваат тежински графови.
Пример за тежински графови:
Циклус

 Циклус претставува пат во еден граф каде што, тргнувајќи од едно теме и патувајќи
низ графот, можеме повторно да се вратиме кај истото тоа теме. На пример, ако
разгледуваме патишта во една држава, циклус може да претставува патот Скопје ->
Куманово -> Велес -> Скопје (да тргнеме од Скопје, па од таму да патуваме до
Куманово, па од Куманово до Велес, па од Велес до Скопје). Најчесто, при
решавањето на разни задачи поврзани со графовите, ќе забележите дека истите многу
полесно се решаваат доколку графот не содржи циклуси. Сепак, голем број од
графовите содржат еден или повеќе циклуси.
Дрво

 Дрво претставува неориентиран граф (ребрата немаат насока), каде што темињата се
меѓусебно поврзани со точно еден пат (не постои повеќе од еден начин да се стигне
од било кое теме до било кое друго теме). Нормално, ова значи и дека дрвата не
содржат циклус, но и дека истите имаат точно (N – 1) ребро, каде што N е бројот на
темиња. Имено, точно (N-1) ребро се потребни за да се поврзат N темиња, на начин
што постои точно еден пат помеѓу било кои две темиња во тој граф.
Претставување на граф
 Кога ќе пишуваме програми кои работат со графови, ќе ни треба
начин за да ги претставиме самите графови во компјутерска меморија
– на пример, кои темиња се поврзани со кои други темиња со ребра.
Иако постојат повеќе начини на кои ова може да се изведе, ние ќе се
фокусираме на двата најмногу споменувани начини: користење на
матрица на соседство (што може да се користи кога работиме со
графови кои имаат релативно мал број на темиња), и користење на
листи на соседство (ова е начинот кој ќе го користиме ние, при
пишувањето на сите алгоритми кои ќе ги споменуваме почнувајќи од
наредното предавање).
 Да разгледаме најпрвин како можеме да претставиме еден граф со помош на
матрица на соседство. Имено, да замислиме дека имаме граф со N темиња
(каде N е релативно мал број – на пример, до 100). Во ваков случај, можеме
да направиме матрица со големина N*N, каде секој елемент од матрицата ij
(i-ти ред, j-та колона) ќе означува дали постои ребро помеѓу i-тото теме и j-
тото теме (доколку имаме тежински граф, запишаната вредност во матрицата
може да биде тежината на реброто). На пример, на следната матрица е
претставен граф од 5 темиња, и врските помеѓу нив:
 Најпрвин, забележете дека матрицата има големина 5x5 (5 редови и 5 колони), бидејќи графот е
составен од 5 темиња. Во матрицата постојат повеќе елементи еднакви на 0 (може да се користи
и бројот -1, или нешто слично), со што означуваме дека не постои ребро помеѓу тој пар на
темиња. Од друга страна пак, да го разгледаме елементот во матрицата каде што е запишан
бројот 4. Тој се наоѓа во ред каде индексот е еднаков на 3, а колоната е еднаква на 0. Со тој број,
имаме означено дека постои ребро помеѓу темето означено со 3 и темето означено со 0, и дека
тежината на тоа ребро е 4. Слично, од темето 3 постојат и две други ребра (со тежина 7), до
темињата означени со индексите 2 и 4. Обидете се да ги откриете и другите ребра запишани во
матрицата. Претставување на еден граф со помош на матрица
Претставување на граф со листи на
соседство.
 Вториот начин на кој што можеме да претставиме еден граф и ребрата во
него е преку т.н. листи на соседство. Имено, замислете дека за секое теме во
графот чуваме по една листа во која што ни се запишани темињата до кои
постои ребро. На пример, за граф со 5 темиња, тоа може да изгледа вака:
 Со листите на соседство, имаме обележано дека од темето означено со
индекс 0 постојат ребра до темињата означени со 2 и 3. Слично, од темето
означено со индекс 2, постојат ребра до темињата означени со 0 и 4, итн... Од
темето означено со 1, не постојат ребра до ниту едно друго теме. Доколку
работиме со тежински графови, наместо листите да ни содржат само броеви
(како [2, 3]), тие може да се составени од пар од броеви, каде што првиот
елемент ќе означува до кое теме покажува реброто, а вториот број неговата
тежина – на пример, [ (2, 5), (3, 7) ], со што имаме претставено дека од тоа
теме постои ребро до темето 2 (со тежина 5), и до темето 3 (со тежина 7). Се
разбира, како што споменавме и во претходната дискусија, тежините можат
да претставуваат должина, некоја друга мерка за проточност (на пример,
колку литри вода може да се испраќаат по таа цевка во еден час, итн).
 При пишувањето на програми, ќе забележите дека често ќе работите со
неориентирани графови (каде што ребрата немаат насока). Во таков случај,
кога ќе обележуваме дека постои ребро од едно теме до друго (во листата),
ќе запишеме и дека постои ребро од тоа друго теме до првото. На пример,
ако го погледнете примерот, ќе видите дека кај темето со индекс 0 имаме
запишано дека од него постои ребро до темето 2, но и ако погледнеме во
листата на соседство за темето со индекс 2, ќе видиме дека таму е запишано
дека постои ребро до темето 0. На овој начин, алгоритмите кои ќе ги
пишуваме ќе можат едноставно да ги одредуваат врските (за да видат до кои
темиња постојат ребра).
Изработил: Стефан Марковиќ IV-1

You might also like