Documente Academic
Documente Profesional
Documente Cultură
Capitolul
Reprezentarea grafurilor
Traversarea grafurilor
Implementri sugerate
Probleme propuse
Soluiile problemelor
0 dac (i, j ) U
Avnd n vedere c ntr-un graf neorientat pentru o muchie (i, j) U este adevrat
relaia (i, j) = (j, i) rezult c matricea de adiacen este simetric fa de diagonala
principal.
Fie graful din figura al1
0 1 0 1 1
1 0 0 1 0
turat. Pentru acest graf ma2
1 1 1 0 1
1 0 0 1 0
126
5. Teoria grafurilor
Muchia (x, y) exist n graf, dac elementul Axy este egal cu 1, n caz contrar nu
exist astfel de muchie n graf. O alt proprietate a matricei de adiacen este c suma
tuturor elementelor matricei este egal cu 2 m, iar numrul elementelor de pe linia x
este chiar gradul vrfului x.
Construirea matricei de adiacen se poate realiza direct dac matricea se citete
din fiierul de intrare, sau poate fi iniial completat cu elemente nule, urmnd s se
citeasc m perechi de numere corespunztoare vrfurilor de la extremitile muchiilor
i pentru fiecare pereche de numere x i y se atribuie lui Aij 1, respectiv Aji 1.
Matricea de adiacen se poate folosi, de asemenea pentru a memora grafurile orientate. Diferena fa de cele neorientate se datoreaz faptului c un arc (x, y) dintr-un
graf orientat are urmtoarea proprietate (x, y) (y, x). Din acest motiv matricea de
adiacen a unui graf orientat nu este simetric, iar suma elementelor matricei este
egal cu numrul arcelor din graf.
Liste de adiacen
245
14
4
1235
14
Numrul vrfurilor adiacente ale unui vrf este chiar gradul acestuia i, evident, suma lungimilor listelor este egal cu 2 m.
Pentru a determina dac o muchie aparine grafului, aceasta trebuie cutat n lista
extremitilor unuia dintre vrfuri, ceea ce implic un algoritm mai lung dect n cazul
cutrii ntr-o matrice de adiacen.
Construirea listelor de adiacen se poate realiza n momentul citirii datelor.
5. Teoria grafurilor
127
Subalgoritm Liste_de_adiacen:
citete n
{ citirea numrului de vrfuri }
ct timp nu urmeaz marca de sfrit de fiier execut:
{ citirea extremitilor a unei muchii }
citete i,j
nvec[i] nvec[i] + 1
{ crete numrul vrfurilor adiacente lui i }
nvec[j] nvec[j] + 1
{ crete numrul vrfurilor adiacente lui j }
a[i,nvec[i]] j
{ memorm vrful adiacent cu i }
{ memorm vrful adiacent cu j }
a[j,nvec[j]] i
sfrit subalgoritm
128
5. Teoria grafurilor
3
4
Pentru nceput, pe prima poziie se reine primul vrf parcurs, i anume 1. Apoi se
adaug toate nodurile adiancente cu el. Astfel irul devine: 1, 2, 4. Urmeaz s se viziteze nodurile adiacente cu 2, care nu au fost scrise deja n ir acesta devine: 1, 2, 4,
3. Se trateaz apoi nodurile adiacente lui 4 i se obine: 1, 2, 4, 3, 6. Apoi urmeaz
vrfurile adiacente cu 3, dar vrful 2 i vrful 6 sunt vizitate deja, deci nu vor fi scrise
n ir. La sfrit se parcurg vrfurile adiacente lui 6, adic doar 5 care este nevizitat i
cele adiacente lui 5 (care nu mai are vecini nevizitai). Se obine irul final: 1, 2, 4, 3,
6, 5.
5. Teoria grafurilor
129
n algoritm am notat cu c irul n care se vor reine pe rnd etichetele vrfurilor grafului, iar n viz inem evidena vizitrilor. Dac valoarea lui vizi este adevrat, nseamn c nodul i a fost parcurs deja.
Subalgoritm BF:
c[1] i { se determin vrfurile la care se poate ajunge pornind de la nodul i }
{ k este lungimea irului c }
k 2
z 1
{ z parcurge irul nodurilor memorate n c }
ct timp z < k execut:
{ se iau toate vrfurile din irul c }
t c[z]
{ se caut vecinii nodului de pe poziia z n ir }
{ se marcheaz faptul c acest nod a fost parcurs }
viz[t] adevrat
pentru j=1,n execut:
130
5. Teoria grafurilor
vrf, se caut vecini pentru vrfuri anterior memorate n ir. Astfel se obine succesiunea de parcurgere a vrfurilor grafului din prima figur din acest capitol.
Pentru o astfel de parcurgere este recomandat memorarea grafului sub form de
liste ale vrfurilor adiacente. n cazul grafului din a doua figur din acest capitol listele
de adiacen sunt:
(2, 4); (1, 3); (2, 6); (1, 6); (6); (3, 4, 5).
Parcurgerea n adncime poate fi utilizat n determinarea componentelor conexe
care apeleaz un subalgoritm recursiv pentru a putea parcurge toate vrfurile din graf.
Subalgoritm FD(i):
viz[i] adevrat
pentru j=1,nveci execut:
dac nu viz[a[i,j]] atunci
FD(a[i,j])
sfrit dac
sfrit pentru
sfrit subalgoritm
5. Teoria grafurilor
131
ORASE.OUT
11
2 1 4 5 3 2
2
5
4
2
3
1 7
4
132
5. Teoria grafurilor
PARC.OUT
3
1 1 2 3 2
1
2
4
3
5. Teoria grafurilor
133
Un turist afl care sunt porturile ntre care exist curse directe ale navelor i dorete
s stabileasc cluburile maritime existente.
S se scrie un algoritm care ajut turistul s determine numrul de cluburi i componena lor.
Date de intrare
Pe prima linie a fiierului de intrare CLUB.IN se afl un numr natural n, reprezentnd
numrul porturilor din zona respectiv. Pe urmtoarele linii se gsesc cte dou numere i i j, separate prin spaiu, reprezentnd faptul c ntre porturile i i j exist curs
direct.
Date de ieire
Pe prima linie a fiierului de ieire CLUB.OUT se va scrie un numr natural nc, reprezentnd numrul de cluburi existente, iar pe urmtoarele nc linii vor fi trecute numere
naturale separate prin spaiu, reprezentnd numerele de ordine ale porturilor care fac
parte dintr-un acelai club.
Restricii i precizri
1 n 100.
Exemplu
CLUB.IN
5
1 5
1 4
2 3
CLUB.OUT
2
1 4 5
2 3
1
2
4
3
134
5. Teoria grafurilor
localitate, sau este un drum nfundat (adic nu are ieire dect la un capt), se consider c acea strad se termin cu o intersecie imaginar. Interseciile se numeroteaz
cu primele numere naturale. O strad se noteaz prin numerele de ordine ale celor
dou intersecii care o delimiteaz. ntre dou intersecii nu exist dect o strad care
le leag direct. Nu exist nici o strad care ncepe i se sfrete n aceeai intersecie.
Scriei un algoritm care ajut distribuitorul s determine dac exist un astfel de
traseu i dac exist, s indice unul.
Date de intrare
Pe prima linie a fiierului de intrare STRAZI.IN se afl dou numere ntregi n i m,
separate printr-un spaiu, reprezentnd numrul interseciilor din ora, respectiv numrul strzilor repartizate distribuitorului. Pe urmtoarele m linii se gsesc cte dou numere i i j, separate printr-un spaiu, reprezentnd strzile, adic numerele de ordine
ale celor dou intersecii care delimiteaz o strad.
Date de ieire
Fiierul de ieire STRAZI.OUT va conine pe prima linie cuvntul 'DA', sau 'NU', exprimnd rspunsul la ntrebarea dac exist un traseu care trece pe toate strzile o singur dat. Pe urmtoarea linie vor fi trecute numerele de ordine ale interseciilor care
delimiteaz cte o strad prin care trece distribuitorul, separate prin cte un spaiu.
Primul i ultimul numr trebuie s coincid deoarece distribuitorul trebuie s se ntoarc n punctul de plecare.
Restricii i precizri
1 n 10;
parcurgerea unei strzi ntr-un sens implic distribuirea fluturailor la toate casele
de pe strada respectiv (i pe o parte i pe alta a strzii) i nu este necesar parcurgerea strzii n ambele sensuri.
Exemple
STRAZI.IN
5 6
1 4
1 5
2 3
2 5
3 5
4 5
STRAZI.OUT
DA
1 4 5 2 3 5 1
1
2
4
3
5. Teoria grafurilor
STRAZI.IN
5 4
1 4
1 5
2 3
2 5
135
STRAZI.OUT
NU
1
2
4
3
136
5. Teoria grafurilor
Exemplu
PAPA.IN
7
2 1
2 4
1 7
4 7
6 7
5 6
3 6
5 3
1 4
PAPA.OUT
2 5 1 3 4 6 7
3: Condimenteaz carnea
5:Taie carnea
6: Frige carnea
2: Spal legume
2: Spal legume
7: Spal vase
1: Taie
legume
4: Amestec salata
3: Condimenteaz 4: Amestec
carnea
salata
5. Teoria grafurilor
137
Restricii i precizri
1 n 100;
exponatele sigur pot fi conectate direct sau indirect la sursa de curent electric;
un exponat poate fi legat la sursa de curent electric i indirect, adic n serie cu un
alt exponat.
Exemplu
ROBOTI.IN
5
0 1 3
0 3 1
0 4 4
0 5 2
1 2 3
1 3 3
2 3 2
2 4 4
3 4 3
3 5 1
4 5 3
ROBOTI.OUT
10
0 3
1 2
2 3
3 4
3 5
Sursa 0
1
3
1
3
4
3
3
2
Sursa 0
1
1
3
3
3
4
5.4.7. Aliane
Pe o planet dintr-un sistem stelar se gsesc n triburi extraterestre. ntre unele dintre
ele exist acorduri de pace. Un astfel de acord presupune c un trib nu poate ataca, sau
nu se poate alia ntr-un atac mpotriva altuia cu care are un acord. n plus un acord are
aceast restricie i asupra unui trib aliat i asupra aliailor tribului aliat. Astfel triburile
aliate direct sau indirect formeaz o comunitate. n schimb triburile din comuniti diferite se pot ataca ntre ele.
Cunoscnd numrul triburilor i acordurile dintre ele, se cere s se afle numrul de
comuniti existente pe planet. Se cere, de asemenea, s se determine acele perechi de
triburi, care ar trebui s semneze acorduri de pace, pentru ca pe planet s se formeze
o singur comunitate.
138
5. Teoria grafurilor
Date de intrare
Pe prima linie a fiierului STEA.IN se afl un numr natural n, reprezentnd numrul
de triburi. Pe urmtoarele linii se afl cte dou numere separate prin cte un spaiu.
Acestea reprezint numerele de ordine ale triburilor ntre care exist acorduri de pace.
Date de ieire
Pe prima linie a fiierului de ieire STEA.OUT se va afia numrul k de comuniti de
pe planet. Pe urmtoarele k linii se vor afla numerele de ordine ale triburilor care fac
parte dintr-o comunitate. (Pe a i-a linie se va descrie a (i 1)-a comunitate.
Dac pe planet exist mai mult de o comunitate, pe linia urmtoare se va afia mesajul 'Acorduri necesare:' i pe urmtoarele linii se vor afia perechi de numere
de ordine ale triburilor care, prin semnarea unui acord vor determina unirea a cel puin
dou comuniti, astfel nct, n final, s fie unite toate comunitile.
Dac exist o singur comunitate nu se mai scrie nimic n fiier.
Restricii i precizri
1 n 100;
Datele de intrare sunt corecte i sunt date toate acordurile o singur dat.
Exemplu
STEA.IN
7
1 3
2 3
4 5
6 7
STEA.OUT
3
1 2 3
4 5
6 7
Acorduri necesare:
1 4
1 6
1
6
5. Teoria grafurilor
139
Date de intrare
Pe prima linie a fiierului BAL.IN se afl un numr natural n, reprezentnd numrul
evenimentelor care se vor realiza. Pe urmtoarele linii se afl triplete de numere x y d
care reprezint precedene ntre evenimente, adic operaia y nu poate fi executat
nainte ca operaia x s se termine i d durata activitii dintre aceste dou evenimente.
Date de ieire
Pe prima linie a fiierului de ieire BAL.OUT se va afia durata total a pregtirilor. Pe
urmtoarea linie se vor afla perechi de numere de ordine, reprezentnd evenimentele
care nu pot ntrzia, deoarece astfel s-ar ntrzia ntreaga pregtire a balului.
Restricii i precizri
1 n 100;
Datele de intrare sunt corecte.
Exemplu
BAL.IN
7
1 2 2
2 4 5
4 7 4
4 6 2
5 6 6
1 3 2
3 5 3
6 7 2
BAL.OUT
13
1 3
3 5
5 6
6 7
2
3
4
2
4
7
140
5. Teoria grafurilor
Date de ieire
Pe fiecare linie a fiierului de ieire TRASEU.OUT se va afia cte un traseu. Un traseu
ncepe la caban i se sfrete la peter. Numerele de ordine ale punctelor dintr-un
traseu sunt separate prin cte un spaiu. Dac nu exist nici un traseu, n fiierul e ieire se va scrie 'Nu exista traseu.'.
Restricii i precizri
1 n 10;
Datele de intrare sunt corecte i sunt date toate traseele marcate o singur dat.
Exemplu
TRASEU.IN
6
1 5
1 2
1 6
2 3
2 6
3 4
3 5
3 6
4 5
5 6
TRASEU.OUT
1 2 3 4 5
1 2 3 5
1 2 3 6 5
1 2 6 3 4 5
1 2 6 3 5
1 2 6 5
1 6 2 3 4 5
1 6 2 3 5
1 6 3 4 5
1 6 3 5
1 6 5
2
1
4
6
5. Teoria grafurilor
141
Date de ieire
Pe prima linie a fiierului de ieire MESAJ.OUT se va afia numrul k de telefoane care
se vor folosi, astfel nct Gigel s afle mesajul printr-un numr minim de intermediari.
Pe urmtoarea linie se vor afia numerele de ordine ale colegilor care trebuie s telefoneze, n ordinea n care, la rndul lor, primesc mesajul, primul fiind numrul de ordine
al lui Ionel, iar ultimul al lui Gigel. Dac nu exist soluie, n fiierul de ieire se va
scrie mesajul 'Nu se poate transmite mesajul.'.
Restricii i precizri
1 n 100;
dac exist mai multe posibiliti de a comunica mesajul, se va afia una dintre ele;
datele de intrare sunt corecte.
Exemplu
MESAJ.IN
6
1 4
1 2
1 6
2 6
3 6
3 4
5 4
MESAJ.OUT
3
1 6 3 4
Explicaie
1 telefoneaz lui 6;
6 telefoneaz lui 3;
3 l anun pe 4.
142
5. Teoria grafurilor
Date de ieire
Pe prima linie a fiierului de ieire AUTO.OUT se va afia distana minim dintre cele
dou localiti. Pe urmtoarea linie se vor afla numerele de ordine ale localitilor prin
care se va cltori ntre cele dou localiti date n fiierul de intrare.
Restricii i precizri
1 n 100;
datele de intrare sunt corecte.
Exemplu
AUTO.IN
5
1 3
1 2 20
1 4 7
2 4 3
2 3 5
4 3 10
4 5 3
3 5 6
AUTO.OUT
15
1 4 2 3
5. Teoria grafurilor
143
Vom nota soluia corect ca fiind o succesiune de noduri (orae) ale grafului parcurse ntr-un traseu de lungime minim [c1, c2, , cn, c1]. Pentru a determina o astfel
de soluie, s considerm c la un moment dat al construirii ciclului sunt determinate
primele k orae n succesiunea de parcurgere a lor ([c1, c2, , ck]) i trebuie s determinm al (k + 1)-lea nod. Acesta se va alege dintre vrfurile adiacente lui ck, vrfuri
care nu au fost deja alese ntre primele k. Dintre nodurile avnd aceast proprietate
vom alege pe acela care este cel mai aproape de nodul ck. Deci l alegem pe x {1,
2, , n}, astfel nct x {c1, c2, , ck} i (ck, x) are lungime minim.
Exemplu
1
4
3
3
5
1
3
Figura 1
Figura 2
1
2
2
4
3
5
1
3
3
3
4
Figura 3
1
3
3
4
Figura 4
n graful din exemplu avem n = 5. Dac primul ora din traseu este 1, atunci conform principiului enunat, vom alege muchia de lungime minim dintre cele incidente
cu vrful 1. Aceasta este (1, 2) de lungime 2. Apoi cutm muchia avnd cel mai mic
cost (lungime de drum) printre muchiile incidente cu oraul (vrful) 2. Alegem muchia
(2, 3) avnd costul 1. Muchia avnd cel mai mic cost printre cele incidente cu vrful 3
este (3, 1), dar oraul 1 a fost deja vizitat. Astfel continum drumul prin nodul 4, apoi
5, dup care ne ntoarcem n oraul 1.
Din pcate acest traseu nu este de lungime minim. Avnd n vedere c prin fiecare
ora trebuie s trecem exact o singur dat, putem privi ciclul cutat ca pe un cerc care
poate (temporar) s nceap din oricare alt nod. Astfel, dac se schimb oraul de
pornire i se aplic aceeai strategie greedy, obinem soluii mai bune, dup cum se
poate vedea n figura 3, respectiv figura 4, unde s-au obinut lungimile 13 respectiv 12
ale ciclurilor hamiltoniene.
144
5. Teoria grafurilor
Subalgoritm CicluHam(costmin,trmin):
costmin
pentru i=1,n execut:
5. Teoria grafurilor
145
sfrit pentru
tr[n+1] i
co co + cost[tr[n],i]
sfrit subalgoritm
146
5. Teoria grafurilor
5. Teoria grafurilor
147
Pentru a determina componentele conexe ale grafului se pot utiliza dou metode.
I. Parcurgerea n lime.
Folosind aceast metod se vor asocia porturilor numere care reprezint clubul din
care fac parte.
Prin parcurgerea n lime se obine o list de vrfuri care sunt legate direct sau
indirect de un anumit nod al grafului.
Pentru nceput se pornete de la un vrf (port) oarecare, de exemplu 1, i se determin toate vrfurile la care se poate ajunge de la el. Toate aceste noduri fac parte din
componenta conex numrul 1.
Apoi, se determin dac mai exist vrfuri care nu au fost parcurse. Dac exist
astfel de vrfuri se repet o parcurgere ca cea descris mai sus pentru unul dintre aceste noduri ca fcnd parte dintr-o alt component conex. Aceti ultimi pai se repet
ct timp exist vrfuri neparcurse.
Subalgoritm ComponenteConexe(n,a,ncc,club)
ncc 0
pentru j=1,n execut:
viz[j] fals { la nceput nici un port nu a fost adugat n vreo component }
sfrit pentru
i 1
repet
ncc ncc + 1
{ o nou component conex }
{ portul i face parte din aceast component }
club[i] ncc
c[1] i
148
5. Teoria grafurilor
n graful din figura precedent, toate vrfurile au fcut parte din aceeai component conex. Dac este vorba ns de un graf neconex
ca n figura alturat, afiarea componentelor
conexe este ceva mai dificil.
Pentru graful din aceast figur irul club va
conine valorile 1, 2, 2, 1, 1.
1
2
5
3
4
5. Teoria grafurilor
Subalgoritm Scrie(club,n):
pentru i=1,ncc execut:
pentru j=1,n execut:
dac club[j] = i atunci
scrie j
sfrit dac
sfrit pentru
149
{ pentru fiecare component conex }
{ se verific toate vrfurile }
{ dac face parte din a i-a component }
{ se afieaz eticheta vrfului respectiv }
150
5. Teoria grafurilor
Aceast secven se apeleaz din programul principal atta timp ct mai exist vrfuri nevizitate.
Algoritm Club:
pentru i=1,n execut:
viz[i] fals
nvec[i] 0
sfrit pentru
citire(n,a)
ncc 0
5. Teoria grafurilor
151
altfel
gr[i] s
sfrit dac
sfrit pentru
sfrit pentru
...
Graful este conex dac pentru oricare dou vrfuri ale sale exist un lan care le
leag. Astfel, pornind de la un vrf oarecare din graf i parcurgnd graful (de exemplu
n lime) ar trebui s putem ajunge n toate vrfurile sale. Dac nu se ajunge ntr-un
vrf, atunci graful sigur nu este conex, iar dac se ajunge n toate, graful este conex.
Pentru a parcurge graful n lime vom pstra ntr-un ir dr vrfurile care se parcurg. La nceput trecem n ir un vrf, de exemplu vrful 1, apoi i trecem pe toi vecinii si (vrfurile adiacente cu el), apoi ajungem la vecinii vecinilor i aa mai departe.
n consecin, dac subalgoritmul nu s-a ntrerupt din cauza c graful nu avea suma
gradelor vrfurilor numr par, urmeaz s verificm dac acesta este conex:
152
5. Teoria grafurilor
...
pentru i=1,n execut:
viz[i] 0
{ la nceput toate vrfurile sunt nevizitate }
sfrit pentru
k 1
{ k este numrul de vrfuri vizitate, iar p este numrul }
p 1
{ de ordine al vrfului cruia i se caut vecinii }
dr[1] 1
{ se pornete din vrful 1 }
viz[1] 1
{ se marcheaz faptul c vrful 1 a fost vizitat }
ct timp p k execut: { ct vreme mai sunt vrfuri care au fost vizitate }
pentru j=1,n execut:
{ li se caut vecinii }
dac (a[dr[p],j] = 1) i (viz[j] = 0) atunci
{ dac aceti vecini nu au fost vizitai, se viziteaz }
k k+1
dr[k] j
viz[j] 1
{ i se reine faptul c au fost parcurse }
sfrit dac
sfrit pentru
p p + 1
{ se trece la urmtorul vrf dintre cele vizitate deja }
sfrit ct timp
dac k < n atunci
verif fals
{ dac nu s-au vizitat toate vrfurile, graful nu este conex }
sfrit dac
sfrit subalgoritm
5. Teoria grafurilor
153
Subalgoritm construire(n,m,a,ce):
{ se construiete ciclul C1 n graf pornind de la vrful 1 }
ce[1] 1
k 1
repet
pentru i=1,n execut:
{ se caut o strad n graf }
dac a[ce[k],i] = 1 atunci
a[ce[k],i] 0
{ se marcheaz n matricea de adiacen faptul }
a[i,ce[k]] 0
{ c aceast strad a fost parcurs }
sfrit dac
sfrit pentru
154
5. Teoria grafurilor
5. Teoria grafurilor
155
156
5. Teoria grafurilor
Vom asocia fiecrui nod un numr de ordine care reprezint numrul componentei
conexe din care face parte. Iniial fiecare nod k face parte din componenta conex
avnd numrul de ordine k. n momentul n care dorim s stabilim dac o muchie poate fi selectat sau nu, vom verifica dac extremitile lor fac parte din componente conexe diferite sau nu. n caz afirmativ muchia nu poate fi selectat, deoarece astfel s-ar
forma un ciclu. Dac extremitile aparin unor componente conexe diferite, prin selectarea muchiei, acetia se unesc. Reamintim c un arbore are exact n 1 muchii,
deci algoritmul se oprete cnd s-au selectat n 1 muchii.
Memorm graful prin lista muchiilor, i pentru fiecare muchie reinem extremitile
sale (i i j) i costul su (c).
Subalgoritm ArborePartialMinimKruskal(n,a,ct):
much 0
pentru i=0,n execut
cc[i] i
{ fiecare nod este ntr-o component conex separat }
sfrit pentru
k 1
ct timp much < n - 1 execut:
{ ct timp nu am selectat n 1 muchii }
dac cc[a[k].i]cc[a[k].j] atunci { dac muchia nu formeaz ciclu }
a[k].d adevrat
{ o selectm }
dac cc[a[k].i] < cc[a[k].j] atunci
min cc[a[k].i]
max cc[a[k].j]
altfel
min cc[a[k].i]
max cc[a[k].j]
sfrit dac
pentru i=1,n execut:
{ unim cele dou componente conexe }
dac cc[i] = max atunci
cc[i] min
sfrit dac
sfrit pentru
much much + 1
{ numrul muchiilor selectate crete }
ct ct+a[k].c
{ calculm costul total parial }
sfrit dac
k k + 1
{ avansm n irul muchiilor ordonate }
sfrit ct timp
sfrit subalgoritm
5. Teoria grafurilor
157
vrfului n care suntem. Deoarece vrfurile neselectate sunt considerate vrfuri izolate,
n acest algoritm nu este necesar s verificm dac muchia care urmeaz s fie adugat formeaz ciclu sau nu.
De data aceasta reprezentarea avantajoas este prin matricea costurilor, n care corespunztor muchiilor inexistente valoarea va fi, nu 0, ci infinit, astfel facilitnd selectarea muchiei de cost minim. Aceast iniializare o realizm anterior citirii matricei
costurilor.
Subalgoritm ArborePartialMinimPrim():
ct 0
pentru i=1,n execut:
{ nc nu am selectat nici un vrf }
sel[i] fals
sel[1] adevrat
{ selectm primul vrf }
e1[1] 1
{ extremitatea 1 a muchiei selectate }
pentru i=1,n execut:
{ distana dintre vrful 1 i i }
d[i] a[1,i]
e[i] 1
{ vrful de plecare este 1 }
sfrit pentru
k 1
{ trebuie s selectm n 1 muchii }
pentru i=1,n-1 execut:
min inf
pentru j=2,n execut:
{ dac vrful j nu este selectat i distana la el este mai mic dect min }
dac nu sel[j] i (d[j] < min) atunci
{ cutm distana minim }
min d[j]
care j
{ extremitatea de sosire a muchiei de cost minim }
sfrit dac
sfrit pentru
sel[care] adevrat
{ selectam vrful care }
{ i muchia corespunztoare }
e1[i] e[care]
e2[i] care
{ adunm costul muchiei selectate la costul total }
ct ct + min
d[j] a[care,j]
e[j] care
sfrit dac
sfrit pentru
sfrit pentru
sfrit subalgoritm
158
5. Teoria grafurilor
5.5.7. Aliane
Din nou, reprezentarea datelor sub forma unui graf neorientat este binevenit, astfel
triburile le asociem vrfurilor, iar acordurile dintre triburi, muchiilor grafului.
Dac ntre dou triburi exist un acord, nseamn c cele dou vrfuri corespunztoare fac parte din aceeai component conex. Deci, dac ar exista acorduri ntre triburi astfel nct toate vrfurile s fac parte din aceeai component conex, am putea
considera c triburile i-au atins scopul.
Vom porni de la graful n care toate vrfurile sunt de grad zero. Acestui graf i vom
aduga muchii, una dup alta, unind componentele conexe existente la un moment dat.
Iniial exist n componente conexe, corespunztoare celor n vrfuri izolate.
Pentru fiecare vrf vom memora n irul cc numrul de ordine al componentei conexe din care face parte. Iniial, vrful k face parte din componenta conex avnd numrul de ordine k. Numrul de ordine al componentei conexe creia i aparine un anumit vrf se modific dac vrful este unit printr-o muchie de o alt component conex.
Reprezentarea datelor se va realiza sub forma listei muchiilor.
Subalgoritm DeterminareaComponentelorConexe(n,m,a,ncc,cc):
k 1
ncc n
pentru i=1,n execut:
{ fiecare nod este izolat }
cc[i] i
sfrit pentru
{ se adaug toate muchiile }
ct timp k m execut:
dac cc[a[k].i] cc[a[k].j] atunci
{ dac extremitile unei }
min cc[a[k].i]
{ muchii fac parte din componente diferite }
max cc[a[k].j]
ncc ncc-1
sfrit dac
pentru i=1,n execut:
{ unim cele dou componente conexe }
dac cc[i] = max atunci
cc[i] min
sfrit dac
sfrit pentru
k k + 1
sfrit ct timp
sfrit subalgoritm
Dup determinarea componentelor conexe acestea trebuie afiate cte una pe o linie. Numrul componentelor conexe este memorat n variabila ncc.
5. Teoria grafurilor
159
Subalgoritm Afiare(n,ncc,cc):
scrie ncc
{ afieaz numrul de comuniti }
pentru i=1,n execut:
dac cc[i] > 0 atunci
scrie i
pentru j=i+1,n execut:
dac cc[j] = cc[i] atunci { se afieaz membrii unei comuniti }
scrie j
cc[j] 0
{ marcm vrfurile afiate }
sfrit dac
sfrit pentru
sfrit dac
sfrit pentru
...
160
5. Teoria grafurilor
n orice graf de activiti exist un vrf care reprezint nceperea lucrrii i nu este
extremitate final a nici unui arc. De asemenea, exist un vrf care reprezint ncheierea lucrrii i nu este extremitate iniial a nici unui arc. Cu alte cuvinte, din primul
vrf pleac arce i n cel de-al doilea sosesc arce. n plus, graful nu are circuite.
2
4
7
n graful din figura de mai sus vrful 1 reprezint nceperea activitii, iar vrful 7
reprezint ncheierea activitii. n cazul unei lucrri executantul i pune problema necesarului de timp pentru ca ntreaga lucrare s poat fi realizat. Din exemplu reiese c
lucrarea respectiv se poate executa n 13 uniti de timp. Acest numr este dat de lungimea celui mai lung drum din graf (de la vrful 1 la vrful 7). Practic, pot exista anumite activiti care dispun de mai mult timp dect au nevoie. n exemplul de mai sus
exist trei drumuri de la vrful 1 la vrful 6. Lungimile lor sunt 9, 11 respectiv 10. Activitatea (6, 7) nu se poate realiza dect dup ce activitile (4, 6) i (5, 6) au fost ncheiate i evident, cele care le preced pe acestea. Din acest punct de vedere activitile
(1, 2) sau (2, 4) sau (4, 6) au o posibilitate ca pe ansamblu s ntrzie cte 2 uniti fa
de durata lor prestabilit, deoarece n aceste condiii nu ntrzie terminarea ntregii lucrri. Ct despre activitile (1, 3), (3, 5) i (5, 6), dac acestea ntrzie, determin ntrzierea ntregii lucrri. Cu alte cuvinte aceste muchii se numesc critice. Activitile
critice ntr-un graf de activiti determin un drum care leag primul vrf de ultimul
care se numete drum critic.
n problema dat se cere determinarea lungimii drumului critic i a arcelor care l
compun, din graful de activiti asociat pregtirilor balului.
Pentru a determina drumul critic vom construi dou iruri lung i tr.
lung este pentru fiecare vrf vi lungimea celui mai lung drum de la primul vrf la vi;
tr reprezint pentru fiecare vrf vi diferena dintre lungimea total a drumului critic
i lungimea minim a drumului de la vi la ultimul vrf din graf.
diferena trk lungk reprezint rezerva de timp pe care o au evenimentele care nu
fac parte din drumul critic i ajung n vrful k.
pentru evenimentele (x, y) care fac parte din drumul critic avem:
trx = lungx i try = lungy i lungy = lungx + dx,y.
0 0
1
2
3
2 2
2 4
4
3
5
5 5
5
2
7 9
4
2
6
11 11
4
7
13 13
5. Teoria grafurilor
161
Subalgoritm DrumCritic(n,a,lung,tr):
pentru i=1,n execut:
{ iniializarea datelor de lucru }
lungi -1
lung1 0
viz1 adevrat
i 1
v[i] 1
{ parcurgem toate vrfurile }
pentru k=1,n execut:
{ arcele care pornesc din al k-lea vrf }
pentru j=1,n execut:
dac a[v[k],j] > 0 atunci
162
5. Teoria grafurilor
5. Teoria grafurilor
163
L3 = 2
1
4
6
L1 = 0
L6 = 1
L5 = 2
4 L4 = 3
{ numrul de copii }
{ p vrea s transmit mesaj lui s }
164
5. Teoria grafurilor
Subalgoritm LanMinim(n,p,s,nv,ve,prec,lung):
pentru i=1,n execut:
{ se iniializeaz distanele }
lung[i] -1
sfrit pentru
{ distana de la nodul p la el nsui este zero }
lung[p] 0
tel[1] p
k 1
u 1
{ toi copiii se vor vizita }
ct timp k u execut:
Afiarea se realizeaz cu ajutorul unui subalgoritm recursiv, deoarece dac am afia pur i simplu lista predecesorilor, am obine o secven invers de la s la p n loc s
fie de la p la s.
Subalgoritm Afiare(k):
dac k p atunci
Afiare(prec[k])
sfrit dac
scrie k
sfrit subalgoritm
5. Teoria grafurilor
165
Pentru a putea determina distana minim ntre dou localiti vom folosi algoritmul lui Dijkstra. Acesta determin lungimea minim a lanurilor care pornesc dintr-un
vrf al grafului i pleac spre celelalte vrfuri cu o strategie greedy.
Algoritmul se poate aplica att n cazul unor grafuri orientate ct i neorientate.
Memorarea grafurilor se va realiza cu ajutorul matricei costurilor. Memorarea predecesorilor fiecrui vrf va fi util n afiarea lanurilor (drumurilor).
Fiecrui vrf din graf i se va asocia o lungime fa de vrful x0 care iniial este considerat foarte mare (infinit). Vrful x0 are asociat lungimea 0 (zero). Acest vrf se
trece n mulimea vrfurilor vizitate. n mulimea vrfurilor vizitate se adaug pe rnd
vrfurile care sunt adiacente lui x0 determinnd lungimea minim a drumului ctre ele.
n figura urmtoare exemplificm modalitatea de construire a drumurilor pentru
graful:
L2 =
2
20
1
L1 = 0
10
L3 =
L4 =
L5 =
20
1
L1 = 0
7
4
L4 = 7
L2 = 10
L3 = 17
L2 = 10
20
L1 = 0
10
7
4
L4 = 7
1
5
L5 = 10
L1 = 0
L4 = 7
L3 = 15
3
10
L5 = 10
Se poate observa c o muchie direct ntre dou vrfuri nu este neaprat cel mai
scurt drum ntre cele dou localiti. Astfel la calculul distanelor vom ine cont de valoarea minim a tuturor drumurilor ntre cele dou localiti.
La fiecare moment alegem un vrf neparcurs, care se situeaz la distan minim
fa de x0, lund n considerare toate drumurile care l leag pe acesta de x0. Pentru toi
succesorii si (vrfurile adiacente) se recalculeaz lungimile drumurilor.
Subalgorim Dijkstra(n,a,lung):
{ W este iniial mulimea tuturor vrfurilor }
W V
pentru i=1,n execut:
lungi infinit
sfrit pentru
{ se calculeaz distanele pornind de la vrful p }
lungp 0
166
5. Teoria grafurilor
ct timp W execut:
{ ct timp exist noduri nevizitate }
vm vrful din W pentru care lungvm este minim
W W \ {vm}
{ vrful se marcheaz ca fiind vizitat }
pentru j=1,n execut:
dac a[vm,j] 0 atunci