Sunteți pe pagina 1din 37

5.

Arbori pariali
Adeseori apar n practic probleme a cror rezolvare implic
noiuni i rezultate din teoria grafurilor. S considerm, de exemplu,
proiectarea unei reele de telecomunicaii care s conecteze un numr dat
de centrale, de amplasare cunoscut, astfel nct ntre oricare dou
centrale s existe legtur. Unei astfel de probleme i se poate asocia un
graf neorientat n care mulimea vrfurilor este format din centralele ce
trebuie interconectate, iar mulimea muciilor din perecile de centrale
ntre care se poate realiza o legtur direct. !entru ca ntre oricare dou
centrale s existe legtur, ar trebui ca graful s fie conex, dar, ca n
orice problem practic, intervine factorul de cost i atunci ar fi de dorit
s se selecteze un numr ct mai mic posibil de legturi directe ntre
centrale, cu alte cuvinte intereseaz un graf parial conex minimal al
grafului, deci un arbore.
Definiie
"ie # $ %&, U' un graf neorientat. (umim arbore parial al
grafului # un graf parial care este arbore.
Teorem
)ondiia necesar i suficient ca un graf s conin un arbore
parial este ca graful s fie conex.
Demonstraie:
Necesitatea !resupunem c # $ %&,U' admite un arbore parial
* $ %&, U+', U+ U. *, fiind arbore, este conex i adugnd la *
muciile din U,U+ el rmne conex. -eci # conex.
Suficiena !resupunem c # este conex. -ac # este conex
minimal, el este arborele parial cutat. Altfel, exist o mucie .x,/0U
astfel nct graful #
1
$ %&, U,1.x,/02' este conex. -ac #
1
este conex
minimal, arborele parial cutat este #
1
, altfel continum procedeul de
eliminare a muciilor pn cnd obinem un graf conex minimal, care va
fi un arbore parial a lui #.
3.4.-.
Observaie
!rocedeul descris are un numr finit de pai, deoarece la fiecare
pas este eliminat o mucie, iar # are un numr finit de mucii. 5ai
mult, putem demonstra urmtoarea proprietate 6
Propoziie
"ie # $ %&, U' conex, 7&7 $ n, 7U7 $ m. (umrul de mucii ce
trebuie nlturate pentru ca graful s devin un arbore este m,n89
%numrul ciclomatic al grafului'.
Demonstraie:
178
!resupunem c prin eliminarea unui numr oarecare de mucii din # am
obinut un graf #+ fr cicluri %o pdure'. "iecare din componentele
conexe ale lui #+ este un arbore.
(otm 6
, p numrul componentelor conexe,
, n
i
numrul de vrfuri din componenta conex i, i19,:,...,p2
, m
i
numrul de mucii din componenta conex i, i19,:,...,p2.
4vident c m
i
$ n
i
,9, i19,:,...,p2.
(umrul de muci din #+ este
( ) n n p i
i
p
=
=

1
1
-eci au fost eliminate m,n8p mucii. )nd #+ este arbore, deci conex
%p$9', numrul muciilor eliminate este m,n89.
3.4.-.
; prim problem, cu aplicaii, de exemplu, n cimie ar fi
generarea tuturor arborilor pariali ai unui graf dat. !entru acesta vom
folosi metoda bac<trac<ing.
Reprezentarea informaiilor
,=om reprezenta graful #$ %&, U' cu a>utorul matricii muciilor,
o matrice # cu dou linii i m coloane %m $ 7U7', n care pentru fiecare
mucie reinem cele dou extremiti.
,?eprezentm un arbore parial ca un vector A cu n,9
componente, n care reinem indicii din # ai muciilor arborelui. !entru a
nu genera de mai multe ori acelai arbore, vom conveni ca muciile s fie
memorate n ordinea cresctoare a indicilor lor din #.
, !entru a verifica dac o mucie nou selectat nu formeaz
cicluri cu muciile de>a selectate, vom ine evidena componentelor
conexe ntr,un vector c de dimensiune n %n $ 7&7', c.i0 desemnnd
componenta conex din care face parte nodul i, pentru i 19,:,..., n2.
Condiii interne
9. A.i0 19, :, ..., m2, i 19, :, ..., n,92
:. A.i0 A.i890, i 19, :, ..., n,:2
@. c.#.9, A.i000 c.#.:, A.i000, i 19, :, ..., n,92%nu se
formeaz cicluri, extremitile muciei fiind n componente
conexe diferite'.
procedure ConstrArbore (i: byte)
*
//genereaz toi arborii pariali care au primele i! muc"ii
*
!rogramul #enerare$rbori%ariali de la sfritul capitolului curent genereaz toi
arborii pariali ai unui graf conex dat.
179
//$&!'()))($&i!'
!ar ": byte
be#in
if i $ n t%en //am selectat n! muc"ii care nu formeaz cicluri
Afi&areArbore
else
//selectez o muc"ie cu indice mai mare dec*t $&i!'
for " :$ A'i()*+) to m do
if c',')- "** c','.- "** t%en
be#in
A'i* :$ " //selectez muc"ia +
/nific(c',')- "**- c','.- "**)
//unific componentele cone,e ale e,tremitilor muc"iei +
ConstrArbore(i+))
0epar(c',')- "**- c','.- "**)
//restaurez situaia dinaintea selectrii muc"iei +
end
end
Aniial, c.i0 6$ i, i 19, :, ..., n2i apelm )onstrArbore%9'.
5.). Arbori pariali de cost minim
Uneori nu intereseaz generarea tuturor arborilor pariali ai unui
graf conex ci numai a celor care satisfac anumite condiii de optim. -e
exemplu, pentru proiectarea reelei de telecomunicaii ar fi interesant
obinerea unui arbore parial care s minimizeze celtuielile.
=om considera n continuare o funcie c6 U ?
8
, care asociaz
fiecrei mucii din graf un cost %n exemplul nostru, s spunem, distana
ntre dou centrale'. -efinind costul unui arbore parial ca fiind suma
costurilor muciilor arborelui, se pune problema obinerii unui arbore
parial de cost minim.
-e exemplu, fie urmtorul graf6
180
"ig. 9.
Acest graf admite mai muli arbori pariali de cost minim, de exemplu6
"ig. :.
5.).). Al#oritmul lui 1rus2al de determinare a unui arbore
parial de cost minim
3

"ie # $ %&, U' un graf conex i c6 U ?
8
o funcie cost. !entru
a determina un arbore parial de cost minim, se pleac de la o pdure
format din n arbori %n $ &', fiecare arbore fiind format dintr,un
singur vrf. Ba fiecare pas se selecteaz o mucie de cost minim care nu
a mai fost selectat i care nu formeaz cicluri cu cele de>a selectate. S
considerm de exemplu, graful din figura 9. Aniial6
"ig. @.
Selectnd o mucie de cost 9, obinem6
*
!rogramul -rus.al de la sfritul capitolului curent genereaz un arbore parial de
cost minim al unui graf conex, utiliznd algoritmul lui Crus<al.
181
"ig. D.
-eci am unificat arborii corespunztori extremitilor muciei
selectate. Selectm din nou o mucie de costul minim 96

"ig. E.
Ba acest pas nu mai putem selecta o mucie de cost 9, deoarece
s,ar obine un ciclu. Selectm mucia de cost :6
"ig. F.
Selectnd, n final, mucia de cost @, obinem un graf fr cicluri
maximal, deci un arbore6
"ig. G.
Ba fiecare pas al algoritmului sunt unificai doi arbori, cei
corespunztori extremitilor muciei selectate. -eci, dup n,9 pai,
pdurea iniial va fi transformat ntr,un singur arbore.
!entru implementarea algoritmului este necesar rezolvarea
182
urmtoarelor dou probleme6 cum extragem mucia de cost minim i
cum testm dac mucia selectat formeaz sau nu cicluri cu cele de>a
selectate.
!entru a extrage minimul, o prim idee ar fi s sortm muciile
cresctor dup cost i s parcurgem secvenial muciile ordonate. Hn
cazul n care arborele parial de cost minim este gsit suficient de repede,
un numr mare de mucii rmn netestate i n acest caz s,ar pierde timp
inutil cu sortarea acestor mucii. ; alt idee, mai eficient, ar fi s
organizm muciile grafului ca un min,eap, structur ce permite
extragerea eficient a minimului.
!entru a testa dac o mucie formeaz cicluri cu muciile de>a
selectate este suficient s testm dac extremitile muciei se gsesc n
aceeai component conex. !entru aceasta va trebui s inem permanent
evidena componentelor conexe %arborilor' care se formeaz.
Reprezentarea informaiilor
9.=om memora graful ntr,un vector # cu m %m $ U' componente,
fiecare component fiind o nregistrare cele dou extremiti i costul
muciei6
5ucie $ record
e9, e:6 =fI
cost6 realI
endI
:. Arborele parial de cost mimim se va memora ntr,un vector A cu n,9
componente ce reine indicii din # ai muciilor selectate
@. 4videna componentelor conexe o vom ine cu a>utorul unui vector c
cu n componente, c.i0 $ componenta conex creia i aparine vrful i.
)omponentele conexe vor fi identificate printr,un reprezentant %vrful cu
indicele cel mai mic din componenta conex respectiv'.
Teorem
Algoritmul lui Crus<al genereaz un arbore parial de cost minim.
Demonstraie:
9. Algoritmul selecteaz numrul maxim de mucii care nu
formeaz cicluri, deci, conform teoremei de caracterizare a arborilor, se
obine un arbore parial.
:. S demonstrm c arborele parial obinut n urma aplicrii
algoritmului lui Crus<al este un arbore parial de cost minim 6
"ie A $ %a
9
, a
:
, ..., a
n,9
' muciile arborelui rezultat n urma
aplicrii algoritmului, n ordinea selectrii lor.
!resupunem prin reducere la absurd c arborele obinut nu este
de cost minim, deci exist A+ $ %a
9
+, a
:
+, ...., a
n,9
+' un alt arbore parial,
astfel nct c%A+' J c%A'.
183
"ie < $ min1i 7 9 i n, a
i
a
i
+2, primul indice de la care A i AK
difer.
-eci A $ %a
1
, a
2
, ..., a
i-1
, a
i
, ..., a
n-1
'
A+ $ %a
1
, a
2
, ..., a
i-1
, a
i
+, .., a
n-1
+', cu a
i
a
i
+ .
4vident c%a
i
' c%a
j
+', > 1i, ..., n,92, altfel algoritmul ar fi
selectat mucia a
j
+ n loc de a
i
, deoarece ar fi avut cost mai mic i nu
formeaz cicluri cu a
1
,...,a
i-1
. Adaug la A+ mucia a
i
. Se formeaz un
ciclu n care intervin doar mucii din 1a
i
+...a
n-1
+2. 4limin una din muciile
ciclului diferit de a
i
. Se obine un arbore AL $ %a
1
,..., a
i-1
, a
i
, a
i89
L..., a
n-
1
L' care are i mucii comune cu A. Hn plus c%AL',c%A+' $ c%a
i
',c%a
j
+' M
c%AL' c%A+'.
?epetm procedeul de nlocuire a muciilor din A+ cu muciile
din A. ;binem c%A+' c%AL' ... c%A'.
-ar am presupus c c%A+' J c%A' contradicie. -eci A este un
arbore parial de cost minim.
3.4.-.
Comple,itatea algoritmului
;rganizarea muciilor ca un min,eap este de O/m0, m $ U.
Algoritmul cerceteaz n cel mai defavorabil caz toate cele m mucii
pentru a selecta n,9, la fiecare pas fiind necesar extragerea muciei de
cost minim, operaie de ;%log m' $ O/log n0. Selectarea unei mucii
implic i o operaie de unificare a doi arbori, al crei timp de execuie
depinde de metoda de unificare aleas.
5.)... Al#oritmul lui Prim de determinare a unui arbore
parial de cost minim
3

)a i algoritmul lui Crus<al, algoritmul lui !rim utilizeaz o
strategie #reed/. Aniial se pleac de la un arbore format dintr,un singur
vrf. Ba fiecare pas se selecteaz o mucie de cost minim astfel nct
mulimea A a muciilor selectate i mulimea N a vrfurilor unite de
acestea s formeze un arbore.
-e exemplu, s considerm graful din figura 9 i vrful de start E. Aniial
"ig. O.
*
!rogramul %rim de la sfritul capitolului curent genereaz un arbore parial de cost
minim al unui graf conex, utiliznd algoritmul lui !rim.
184
Selectm o mucie de cost minim care s fie incident cu vrful E6
"ig. P.
Selectm o mucie de cost minim, care s fie incident cu unul din
vrfurile din subgraful obinut la pasul anterior6
"ig. 9M.
Selectez o mucie de cost 9, incident cu unul din vrfurile din subgraful
anterior6
"ig. 99.
Selectnd cea de a patra mucie, obinem un arbore parial de cost
minim6
"ig. 9:.
Ba fiecare pas se selecteaz un nou vrf, adiacent cu unul din vrfurile
subgrafului, astfel nct mucia corespunztoare s fie de cost minim.
(odul nou adugat va fi terminal i deci nu se vor obine cicluri, iar
subgraful construit este la fiecare pas conex, deci arbore.
Reprezentarea informaiilor
9. ?eprezentm graful prin matricea costurilor, )
nxn
185
C i j
U
U
i j
,
),
,
=

=
R
S
|
|
T
|
|
L
N
M
M
O
Q
P
P
L
N
M
M
O
Q
P
P
L
N
M
M
O
Q
P
P
, dac i,>
c% i,> dac i,>
dac 0
:. Q va fi mulimea vrfurilor neselectate n subgraf %Q $ &,N'.
@. =om utiliza un vector <e/, de dimensiune n, n care pentru fiecare vrf
x Q vom reine costul minim al muciilor ce unesc vrful x cu un vrf v
din subgraf6
<e/.x0 $ min1c%.x, v0'v N2, x &RN.
4vident, dac astfel de mucii nu exist <e/.x0 $ 8.
D. ?einem arborele parial de cost minim, memornd vrfurile grafului n
ordinea n care au fost atinse ntr,un vector p de dimensiune n.
p.x0 $ vrful din care a fost atins x.
procedure Prim
//determin un $%1 al unui graf2 matricea costurilor c( numrul de
// v*rfuri n 3i v*rful de start r sunt variabile globale
!ar 4- "- i: 5f 2ey: array' 5f * of real
6: set of 5f p: array' 5f * of 5f
be#in
//iniializare
for 4 :$ ) to n do 2ey'4* +;
2ey'r* := 7 p'r* :$ 7 := ')- .- ...- n* ( 'r*
8%ile 6 [] do //e,ist v*rfuri neselectate
be#in
i := 4tra#e9in(6) //e,trage din 4 v*rful de c"eie minim
for " :$ ) to n do //actualizez c"eile v*rfurilor din 4
if C'i- "* t%en // i 3i + sunt adiacente
if (" 6) and (2ey'"* : C'i- "*) t%en
be#in
p'"* :$ i
2ey'"* :$ C'i- "*
end
end
end
Comple,itatea algoritmului
Algoritmul execut n,9 pai, la fiecare pas selectnd un vrf din
graf de ceie minim i reactualiznd ceile vrfurilor neselectate,
186
operaie de ;%n'. -eci algoritmul este de ordinul O/n
2
0)
5... Arbori pariali ;<0
5readt"6irstSearc" este tenica de explorare a grafurilor n
lime.
-at fiind un graf conex # $ %&, U' i un nod surs s &,
metoda 56S impune vizitarea mai nti a nodului s, apoi a tuturor
nodurilor nevizitate adiacente cu s, apoi a tuturor nodurilor nevizitate
adiacente nodurilor adiacente cu s, .a.m.d.
-e exemplu, pentru graful din figura de mai >os, parcurgerea
S"S, cu nodul surs s $ F, este6 F, D, E, O, P, :, @, G, 9M, 99, 9, 9:.
"ig. 9@.
?einnd toate muciile utilizate n timpul parcurgerii obinem
arborele parial S"S, cu rdcina s $ F %figura 9D'6 .F,D0, .F,E0, .F,O0,
.F,P0, .D,:0, .D,@0, .E,G0, .O,9M0, .P,990, .:,90, .99,9:0.
"ig. 9D.
Observaie
!entru orice vrf v din arbore, lanul unic care unete rdcina s
de v reprezint lanul cu numr minim de mucii de la s la v n graf.
Reprezentarea informaiilor
9. ?eprezentm graful prin listele de adiacen.
#6 arra/.=f0 of BistaI
-eci pentru fiecare vrf din graf reinem lista vrfurilor adiacente
187
cu vrful respectiv.
:. Arborele parial S"S l reprezentm cu a>utorul unui vector T n care
pentru fiecare vrf reinem vrful din care a fost atins n timpul
parcurgerii S"S.
T6 arra/[=f0 of =fI
@. Utilizm un vector boolean =, n care pentru fiecare vrf din graf
reinem dac a fost sau nu atins n timpul parcurgerii S"S.
=6 arra/.=f0 of booleanI
D. !entru parcurgerea grafului n lime vom utiliza o coad pe care o
iniializm cu vrful surs. Ba fiecare pas extragem un element din
coad, vizitm toate vrfurile nevizitate adiacente cu vrful extras i le
inserm n coad, reinnd pentru fiecare vrf vizitat vrful din care a fost
atins, pentru reconstituirea arborelui parial S"S.
Observaie
#, T, n %numrul de vrfuri din graf' i s %vrful surs' sunt
variabile globale.
procedure ;<0
3

//parcurge 7n lime graful #( 7ncep*nd cu v*rful s construind
//arborele parial 56S
!ar C: Coada =: >ista i: 5f
5: array' 5f * of boolean
be#in
for i :$ ) to n do 5'i* :$ false
C s //iniializez coada cu v*rful surs
8%ile C '* do
be#in
4 C //e,trage un v*rf , din coad
= :$ ,'4*
8%ile = nil do //parcurg lista de adiacen a nodului ,
be#in
i :$ =?.inf
if not 5'i* t%en // nodul i este nevizitat
be#in
5'i* :$ true
T'i* :$ 4//rein v*rful din care a fost atins i
C i @/introduc v*rful i 7n coad
end
= :$ =?.urm
*
!rogramul $rbori%ariali56D6 de la stritul capitolului curent genereaz
arborii pariali S"S i -"S ai unui graf conex dat.
188
end
end
end
Observaii
9. -ac graful # nu este conex parcurgnd S"S fiecare component
conex obinem o pdure, format din arborii pariali corespunztori
fiecrei componente conexe.
8) Comple,itatea algoritmului, n cazul n care graful este reprezentat
prin listele de adiacen, este de O/n9m0, unde n este numrul de vrfuri,
iar m numrul de mucii din graf.
5.A. Arbori pariali D<0
; alt tenic de parcurgere %explorare' a grafurilor este metoda
Dept"6irstSearc" %parcurgerea n adncime'.
-at fiind # un graf conex i un nodul surs s vizitm mai nti
nodul s, apoi primul nod nevizitat adiacent cu s, mergnd n adncime ct
este posibil. )nd un nod x nu mai are vecini nevizitai ne ntoarcem s
cercetm dac nodul din care a fost atins x mai are sau nu vecini
nevizitai i continum parcurgerea.
-e exemplu, pentru graful din figura 9@, parcurgerea dup
metoda -"S, cu nodul iniial s $ F, determin urmtoarea ordine de
vizitarea a nodurilor6 F, D,:,9,@,G,E,O,P,9M,99,9:. 5arcnd muciile
utilizate prin vizitarea nodurilor obinem un arbore parial numit arbore
parial -"S, cu rdcina s $ F %figura 9E'6 .F,D0, .D,:0, .:,90, .:,@0, .@,G0,
.G,E0, .E,O0, .O,P0, .P,9M0, .9M,990, .99,9:0.
"ig. 9E.
Observaie
?eprezentarea informaiilor se face n acelai mod ca la
parcurgerea S"S, n plus vectorul = fiind de asemeni variabil global.
Algoritmul poate fi descris folosind o procedur recursiv -"S,
pe care iniial o apelm cu parametrul s, astfel6
proc e dura DFS(x: Vf);
189
//parcurge vrfurile nevizitate ale grafului ncepnd cu
x
be#in
5'4* :$ true
= :$ ,'4*
8%ile = nil do //parcurg lista de adiacen a v*rfului ,
be#in
i :$ =?.inf
if not 5'i* t%en @/i este nevizitat
be#in
T'i* :$ 4 //rein v*rful din care a fost atins i
D<0(i) //parcurge v*rfurile nevizitate 7ncep*nd cu i
end
= :$ =?.urm
end
end
Observaii
9. -ac graful # nu este conex parcurgnd -"S fiecare component
conex obinem o pdure, format din arborii pariali corespunztori
fiecrei componente conexe.
:. )omplexitatea algoritmului, n cazul n care graful este reprezentat
prin listele de adiacen este de O/n9m0, unde n este numrul de vrfuri,
iar m numrul de mucii din graf.
5.B. Aplicaie. Descompunerea unui #raf Cn componente bicone4e
Definiie
"ie # $ %&, U' un graf neorientat conex. =rful v & se
numete punct de articulaie dac subgraful obinut prin eliminarea
vrfului v i a muciilor incidente cu acesta nu mai este conex.
-e exemplu, pentru graful din figura 9F punctele de articulaie
sunt 9,@,E,G.
190
"ig. 9F.
Definiie
Un graf se numete bicone, dac nu are puncte de articulaie.
Hn multe aplicaii practice, ce se pot modela cu a>utorul grafurilor,
nu sunt de dorit punctele de articulaie. ?evenind la exemplul cu reeaua
de telecomunicaii, dac o central dintr,un punct de articulaie se
defecteaz rezultatul este nu numai ntreruperea comunicrii cu centrala
respectiv ci i cu alte centrale.
Definiie
; component bicone, a unui graf este un subgraf biconex
maximal cu aceast proprietate.
-e exemplu, pentru graful din figura 9F componentele biconexe
sunt6
"ig. 9G.
!entru a descompune graful n componente biconexe vom utiliza
proprietile parcurgerii -"S. !arcurgnd graful -"S putem clasifica
muciile grafului n6
,mucii care aparin arborelui parial -"S %tree edges'I
,mucii .u, v0 care nu aparin arborelui i care unesc vrful u cu
un strmo al su v n arborele parial -"S numite mucii de ntoarcere
%bac< edges'. Acestea sunt marcate n exemplu punctat.
-e exemplu graful de mai sus poate fi redesenat, clasificnd muciile
innd cont de arborele parial -"S cu rdcina @6
191
"ig. 9O.
;bservm c rdcina arborelui parial -"S este punct de articulaie
dac i numai dac are cel puin doi descendeni, ntre vrfuri din
subarbori diferii ai rdcinii neexistnd mucii. 5ai mult, un vrf x
oarecare nu este punct de articulaie dac i numai dac din orice fiu / al
lui x poate fi atins un strmo al lui x pe un lan format din descendeni ai
lui x i o mucie de ntoarcere %un drum Ude siguranV ntre x i /'.
!entru fiecare vrf x al grafului putem defini 6
dfn/,0 = numrul de ordine al vrfului x n parcurgerea -"S a grafului
%dept"firstnumber'.
-e exemplu6
x 0 1 2 3 4 5 6 7 8 9
dfn(x
)
2 1 3 0 4 5 6 7 8 9
-ac x este un strmo al lui / n arborele parial -"S atunci
dfn%x' J dfn%/'.
-e asemeni pentru fiecare vrf x din graf putem defini 6
lo:/,0 = numrul de ordine al primului vrf din parcurgerea -"S ce
poate fi atins din x pe un alt lan dect lanul unic din arborele parial
-"S.
loW%x' $ min1dfn%x', min1 loW%/' 7 / fiu al lui x 2, min1dfn%/' 7 .x,/0
mucie de ntoarcere2.
-e exemplu6
x 0 1 2 3 4 5 6 7 8 9
dfn(x
)
2 1 3 0 4 5 6 7 8 9
low(x
)
2 1 1 0 1 5 5 5 8 9
-eci putem caracteriza mai exact punctele de articulaie dintr,un graf
astfel6
x este punct de articulaie dac i numai dac este rdcina unui
arbore parial -"S cu cel puin doi descendeni sau, dac nu este
rdcin, are un fiu / astfel nct loW%/' dfn%x'.
!entru exemplul din figura 9F6
, nodul @ este punct de articulaie deoarece este rdcina
arborelui parial -"S i are doi descendeni,
, nodul G este punct de articulaie deoarece loW%O'$O dfn%G'$G,
192
, nodul E este punct de articulaie deoarece loW%F'$Edfn%E'$E,
, nodul 9 este punct de articulaie deoarece loW%M'$:dfn%9'$9.
5odificm procedura -"S, pentru a calcula pentru fiecare vrf din
graf valorile dfn i loW.
Antrare6,graful #, reprezentat prin listele de adiacenI
Aeire6,vectorii dfn i loW.
Utilizm o variabil global num, pentru a calcula numrul de ordine
al vrfului curent n parcurgerea n adncime.
@@;niializare
num :$ 7
for 4 :$ ) to n do dfn'4* :$ ()
Dfn>o8(s- ()) // s este rdcina arborelui parial D6S
procedure Dfn>o8(u- tu: 5f)
//parcurge D6S graful # 7ncep*nd cu v*rful u( calcul*nd
// valorile dfn&u' 3i lo:/u02 tu este tatl lui u
!ar =: >ista 4: 5f
be#in
dfn'u* :$ num lo8'u* :$ dfn'u* inc(num)
= :$ ,'u*
8%ile = nil do //parcurg lista de adiacen a lui u
be#in
4 :$ =?.inf
if dfn'4* $ () t%en @@4 este ne!izitat
be#in
Dfn>o8(4- u)
lo8'u* :$ min(lo8'u*- lo8'4*)
//funcia min returneaz minimul argumentelor ei
end
else
if 4 tu t%en lo8'u* :$ min(lo8'u*- dfn'4*)
= :$ =?.urm
end
end
=om folosi aceast idee de calcul recursiv al valorilor dfn i loW
pentru descompunerea n componente biconexe a unui graf neorientat
conex.
?eprezentarea informaiilor se face n acelai mod ca la
parcurgerea -"S, dar vectorul = nu mai este necesar, pentru vrfurile
nevizitate dfn fiind ,9. Hn plus, vom folosi o stiv S n care vom reine
193
muciile din graf %att cele care aparin arborelui ct i cele de
ntoarcere' n ordinea n care sunt ntlnite n timpul parcurgerii. Atunci
cnd identificm o component biconex, mai exact identificm un nod u
care are un fiu x astfel nct loW%x' dfn%u', eliminm din stiv i afim
toate muciile din componenta biconex respectiv.
@@;niializare
num :$ 7
0 (s- ())2
//stiva este iniializat cu o muc"ie fictiv &s(!'( s fiind sursa
for 4 :$ ) to n do dfn'4* :$ ()
;icone4(s- ()) // s este rdcina arborelui parial D6S
procedure bicone4(u- tu: 5f)
3

//afi3eaz componentele bicone,e ( parcurg*nd graful 7ncep*nd
// cu v*rful u2 tu este tatl lui u
!ar =: >ista 4: 5f
be#in
dfn'u* :$ num lo8'u* :$ dfn'u* inc(num)
= :$ ,'u*
8%ile = nil do // parcurg lista de adiacen a lui u
be#in
4 :$ =?.inf
if (tu 4) and (dfn'4* D dfn'u*) t%en 0 'u- 4*
//dac tu=, sau dfn/,0<dfn/u0 muc"ia /u(,0 a fost de+a
//reinut 7n stiv
if dfn'4* = () t%en //, este nevizitat
be#in
;icone4(4- u)
lo8'u* :$ min(lo8'u*- lo8'4*)
if lo8'4* dfn'u* t%en
//am identificat o nou component bicone,
Afisare(4- u) @@ e,trage din S 3i afi3eaz muc"iile
//componentei bicone,e curente
else
if 4 tu t%en lo8'u* :$ min(lo8'u*- dfn'4*)
end
= :$ =?.urm
end
*
!rogramul Componente5icone,e de la sfritul capitolului curent realizeaz
descompunerea n componente biconexe a unui graf neorientat conex.
194
end
Observaie
;ricare dou componente biconexe au cel mult un vrf comun,
deci nici o mucie nu poate fi n dou componente biconexe.
S urmrim execuia algoritmului pe urmtorul exemplu6
"ig. 9P.
Arborele parial -"S este6
"ig. :M.
Eniial:
4 7 ) . A B 5 F G
dfn(4) ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9
lo8(4)
num M
S6
@ ,9
Apelez bicone4(A- ())
4 7 ) . A B 5 F G
dfn(4) ,9 ,9 ,9 M ,9 ,9 ,9 ,9
lo8(4) M
num 9
x 9
195
0:
@ 9
@ ,9
Apelez bicone4()- A)
4 7 ) . A B 5 F G
dfn(4) ,9 9 ,9 M ,9 ,9 ,9 ,9
lo8(4) 9 M
num :
x M
0:
9 M
@ 9
@ ,9
Apelez bicone4(7- )):
4 7 ) . A B 5 F G
dfn(4) : 9 ,9 M ,9 ,9 ,9 ,9
lo8(4) : 9 M
num @
x 9
He!in Cn bicone4()- A)
loW.90 min%loW.90, loW.M0' = loW.90
loW.M0 X dfn.@0. Am obinut o component biconex, afiez ')-7*.
0:
@ 9
@ ,9
x :
0:
9 :
@ 9
@ ,9
Apelez bicone4(.- ))
4 7 ) . A B 5 F G
dfn(4) : 9 @ M ,9 ,9 ,9 ,9
lo8(4) : 9 @ M
196
num D
x 9
x D
0:
: D
9 :
@ 9
@ ,9
Apelez bicone4(B- .)
4 7 ) . A B 5 F G
dfn(4) : 9 @ M D ,9 ,9 ,9
lo8(4) : 9 @ M D
num E
x :
x @
0:
D @
: D
9 :
@ 9
@ ,9
loW.D0 min%loW.D0, dfn.@0' = M
4 7 ) . A B 5 F G
dfn(4) : 9 @ M D ,9 ,9 ,9
lo8(4) : 9 @ M M
He!in Cn bicone4(.- ))
loW.:0 min%loW.:0, loW.D0' = M
4 7 ) . A B 5 F G
dfn(4) : 9 @ M D ,9 ,9 ,9
lo8(4) : 9 M M M
He!in Cn bicone4()- A)
loW.90 min%loW.90, loW.:0' = M
4 7 ) . A B 5 F G
dfn(4) : 9 @ M D ,9 ,9 ,9
lo8(4) : M M M M
loW.90 min%loW.90, dfn.:0'
197
He!in Cn bicone4(A- ())
loW.@0 min%loW.@0, loW.90' loW.90 = dfn.@0.
Am obinut o nou component biconex6 'B-A*- '.-B*- ')-.*- 'A-)*.
0:
@ ,9
x D
loW.@0 min%loW.@0, dfn.D0' = M
x E
0:
@ E
@ ,9
Apelez bicone4(5- A)
4 7 ) . A B 5 F G
dfn(4) : 9 @ M D E ,9 ,9
lo8(4) 9 M M M M E
num F
x @
x F
0:
E F
@ E
@ ,9
Apelez bicone4(F- 5)
4 7 ) . A B 5 F G
dfn(4) : 9 @ M D E F ,9
lo8(4) 9 M M M M E F
num G
x E
x G
0:
F G
E F
@ E
@ ,9
Apelez bicone4(G- F)
198
4 7 ) . A B 5 F G
dfn(4) : 9 @ M D E F G
lo8(4) 9 M M M M E F G
num O
x E
0:
G E
F G
E F
@ E
@ ,9
loW.G0 min%loW.G0, dfn.E0' = E
4 7 ) . A B 5 F G
dfn(4) : 9 @ M D E F G
lo8(4) 9 M M M M E F E
x F
He!in Cn bicone4(F- 5)
loW.F0 min%loW.F0, loW.G0' = E
4 7 ) . A B 5 F G
dfn(4) : 9 @ M D E F G
lo8(4) 9 M M M M E E E
loW.F0 min%loW.F0, dfn.G0' = E
He!in Cn bicone4 (5- A)
loW.E0 min%loW.E0, loW.F0' = E
loW.F0 X dfn.E0, deci afiez o nou component biconex6
'G-5*-'F-G*-'5-F*.
0:
@ E
@ ,9
He!in Cn bicone4(A- ())
loW.@0 = min%loW.@0, loW.E0' = M
loW.E0 = dfn.@0, deci afiez o nou component biconex6 '5-A*.
0:
@ ,9
0top
199
Teorem
!rocedura bicone,/s(!0 genereaz componentele biconexe ale
grafului conex #.
Demonstraie:
=om lua n considerare cazul n care n, numrul de vrfuri din #,
este cel puin : %dac n = 9, # are o singur component biconex,
format dintr,un singur vrf'.
=om face demonstraia prin inducie dup S, numrul de
componente biconexe.
!%9' S = 9 graful este biconex6 rdcina s a arborelui parial
-"S va avea un singur fiu, s,l notm x. Apelul bicone,/,( s0 a explorat
toate muciile grafului i le,a introdus n stiva S. )um x este singurul
vrf pentru care loW.x0 dfn.s0, muciile grafului vor fi afiate ntr,o
singur component biconex.
!%S' S presupunem acum c algoritmul funcioneaz corect
pentru toate grafurile conexe cu cel mult S componente biconexe.
!%S89' =om demonstra c algoritmul funcioneaz pentru toate
grafurile conexe cu cel mult S+9 componente biconexe.
"ie # un graf cu S+9 componente biconexe i fie x primul vrf
pentru care este ndeplinit condiia loW.x0 dfn.u0. !n n acest
moment nu a fost identificat nici o component biconex. Hn urma
apelului bicone,/,( u0( toate muciile incidente cu descendeni ai lui x se
afl n stiva S, deasupra muciei .u, x0. )um x este primul vrf care
ndeplinete condiia loW.x0 dfn.u0, deducem c descendenii lui x nu
sunt puncte de articulaie. )um u este punct de articulaie, rezult c
muciile situate n S, deasupra muciei .u, x0, inclusiv, formeaz o
component biconex. 5uciile acestei componente biconexe sunt
extrase din stiv i afiate, deci, de la acest pas algoritmul revine la
aflarea componentelor biconexe ale unui graf #K, obinut din # prin
eliminarea unei componente biconexe. )um #K are S componente
biconexe, conform ipotezei inductive, algoritmul determin corect
componentele biconexe ale lui #K.
3.4.-.
Observaie
Algoritmul de descompunere n componente biconexe a unui graf
reprezentat prin listele de adiacen este liniar %O/n+m0', unde n este
numrul de vrfuri, iar m numrul de mucii din graf.
5.5. Problem rezol!at
Problema brfei
200
5ara+( $rad !==8
Se consider n persoane !
9
, !
:
, ..., !
n
care doresc fiecare s
transmit propria brfa celorlalte persoane. (umim instruciune o
perece %i, >' avnd urmtorul efect6 persoana !
i
transmite persoanei !
>
propria sa brf, dar i eventualele brfe primite anterior prin instruciuni
de la alte persoane. -in pcate anumite pereci de persoane, citite de la
intrare, se dumnesc i deci nu comunic ntre ele. S se determine,
dac este posibil, o secven de instruciuni prin care fiecare persoan s
cunoasc brfele tuturor celorlalte persoane.
Soluie6
Asociem problemei un graf neorientat astfel6
,mulimea vrfurilor este format din cele n persoane.
,ntre dou vrfuri exist mucie dac cele dou persoane
corespunzatoare comunic.
!roblema are soluie dac i numai dac graful asociat problemei
este conex.
-ac graful este conex, atunci admite un arbore parial.
-eterminm un arbore parial -"S al grafului dat, cu rdcina 9.
!arcurgnd acest arbore n postordine, toate brfele vor fi recepionate
de vrful 9, fiecare mucie utilizat reprezentnd o instruciune.
!arcurgnd arborele n preordine, nodul 9 va transmite brfele tuturor
celorlalte persoane. Sunt astfel necesare :n,: instruciuni.
Observaie
(umrul de :n,: instruciuni este optim.
Reprezentarea informaiilor
,?eprezentm graful prin matricea de adiacen6

g i j ,
,
,
=
0
1
altfel.
dac i i > comunicI
{

,?eprezentm arborele parial -"S ca pe un arbore binar, utiliznd
reprezentarea fiu,frate.
,Utilizam un vector v de dimensiune n, pentru a marca dac un vrf a
fost sau nu atins n timpul parcurgerii -"S6
v i =
0
1
,
,
altfel.
dac i a fost vizitatI
{
program barfa;
const NMaxPers = 7;
type Pers = 0..NMaxPers;
Arbore = ^NodArbore;
NodArbore = record
p: Pers;
tata, fiu, frate: Arbore
end;
var g: arrayPers, Pers! of 0..";
201
n, i: Pers; conex: boo#ean;
v: arrayPers! of 0..";
A: Arbore;
fout: text;
procedure citire;
var f: text; i, $: Pers;
begin
assign%f, &barfa.in&'; reset%f';
read#n%f, n';
for i := " to n do
for $ := " to n do
gi,$! := ";
()i#e not eof%f' do
begin
read#n%f, i, $';
gi,$! := 0; g$,i! := 0
end;
c#ose%f';
end;
procedure *+,%x: Arbore';
-vi.ita/ varfu# x; tx este tata# #ui x0
var i: Pers; 1, u: Arbore;
begin
u := ni#;-u#ti/u# fiu a# #ui x0
for i := " to n do
if %gx^.p, i! = "' and %vi! = 0' t)en
begin
vi! := ";
ne(%1'; 1^.p := i; 1^.tata := x;
1^.fiu := ni#; 1^.frate := ni#;
if u = ni# t)en -i este pri/u# fiu a# #ui x0
x^.fiu := 1
e#se
u^.frate := 1; -i este pri/u# frate a# #ui u0
u := 1;
*+,%1';
end;
end;
procedure postordine%x: Arbore';
-afisea.a instructiuni#e corespun.atoare parcurgerii postordine
a arbore#ui *+,0
var 1: Arbore;
begin
1 := x^.fiu;
()i#e 1 23 ni# do
begin
postordine%1';
1 := 1^.frate;
end;
if x23 A t)en (rite#n%fout,&%&,x^.p,&,&,x^.tata^.p,&'&';
end;
202
procedure preordine%x: Arbore';
var 1: Arbore;
begin
if x 23 A t)en (rite#n%fout,&%&,x^.tata^.p,&,&,x^.p,&'&';
1 := x^.fiu;
()i#e 1 23 ni# do
begin
preordine%1';
1 := 1^.frate;
end;
end;
begin -progra/ principa#0
citire;
assign%fout,&barfa.out&'; re(rite%fout';
v"! := "; A^.p := ";
*+,%A';
conex := true;
for i := " to n do
if vi! = 0 t)en
begin
conex := fa#se;
brea4
end;
if not conex t)en -grafu# este neconex0
(rite#n%fout,&Nu exista so#utii5&'
e#se
begin
postordine%A';
preordine%A';
end;
c#ose%fout';
end.
5.F. I4erciii
9.-emonstrai prin inducie dup numrul de vrfuri din graf c
algoritmul lui !rim produce un arbore parial de cost minim.
:. "ie # $ %&, U' un graf neorientat conex. 5ucia .x, /0 se
numete punte dac prin eliminarea ei din graf, graful parial obinut nu
este conex. Scriei un algoritm care determin toate punile unui graf
conex. Algoritmul s funcioneze n timp de ;%n8m' %n $x, m $U'.
Observaie
; mucie este punte dac i numai dac nu aparine unui ciclu.
@. "ie # $ %&, U' un graf neorientat conex cu funcia pondere
asociat c6 U ?8YI U &.
a'. "ie T un arbore parial de cost minim pentru #. -emonstrai
c exist o mucie .u, v0 T i .x, /0 T astfel nct T,
203
1.u,v021.x,/02 este al doilea cel mai bun arbore parial de cost minim
%S$%1'.
b'. "ie T un arbore parial pentru #. !entru oricare dou vrfuri
u, v & definim max%u, x' ca fiind o mucie de pondere maxim de pe
lanul unic ntre u i v n T.
-escriei un algoritm cu timpul de execuie de ;%&
2
' astfel nct,
dat T, s calculeze max%u, v', u, v &.
D. "ie # $ %&, U' un graf neorientat conex. (umim distana
dintre vrfurile x i /, notat d%x, /', numrul de mucii al celui mai scurt
lan care unete x cu /.
(otm6 e%x' $ excentricitatea vrfului x6
e x d x y
y X
( ) max ( , ) =

d%#' $ diametrul grafului #


d G e x
x X
( ) max ( ) =

r%#' $ raza grafului #


r G e x
x X
( ) min ( ) =

c%#' $ centrul grafului #


c G x Xe x r G ( ) ( ) ( ) = =
q
n

a'. -emonstrai c c%#' este format dintr,un vrf sau din dou
vrfuri adiacente.
b'. Artai c d%#' :Yr%#'.
c'. -escriei un algoritm care s calculeze raza, diametrul i
centrul unui graf conex dat.
>) $rbori pariali DS
; alt tenic de parcurgere n adncime a nodurilor unui graf
este metoda -ept,Searc. Aceast metod mbin cele dou metode de
parcurgere prezentate, n sensul c urmeaz acelai algoritm ca metoda
Sreadt,"irst,Searc numai c utilizeaz o stiv, ca i metoda -ept,
"irst,Searc.
-e exemplu, pentru graful din figura 9@, parcurgerea dup
metoda -S, cu nodul iniial s $ F, determin urmtoarea ordine de
vizitare a nodurilor6 F, D, E, O, P, 9M, 99, 9:, G, @, :, 9. 5arcnd muciile
utilizate prin vizitarea nodurilor obinem un arbore parial numit arbore
parial -S, cu rdcina s $ F %figura :9'6 .F,D0, .F,E0, .F,O0, .F,P0, .P,9M0,
.P,990, .99,9:0, .9M,G, .G,@0, .@,:0, .:,90.
204
"ig. :9.
Scriei un program care realizeaz parcurgerea n adncime dupa
metoda -S a unui graf, cu obinerea arborelui parial -S.
F. !roblema sponsorului %;limpiada (aional de Anformatic,
Suceava 9PPF'
?ATU) Suceava, unul dintre sponsorii olimpiadei, i propune s
mbunteasc transportul n comun n localitate. -irectorul va pune la
dispoziie o scem pe care sunt reprezentate staiile, numerotate pentru
simplificare, de la 9 la n i cele < linii directe ntre staii, astfel nct ntre
oricare dou staii exist legtur, eventual cu scimbarea mi>locului de
transport. Trebuie s determinai dac exist cel puin o linie direct prin
blocarea creia legtura, direct sau indirect, ntre cel puin dou staii
s fie ntrerupt. -ac astfel de linii exist, s se propun nfiinarea unui
numr ct mai mic de linii directe ntre staiile existente astfel nct prin
blocarea unei singure linii directe, oricare ar fi aceasta, circulaia ntre
oricare dou staii s fie posibilI se alege soluia pentru care suma
ocolurilor pe traseele varianta %msurate n numr de linii directe' s fie
ct mai mic.
205
Ane4
program Generare_Arbori_Partiali;
const NMax6f = 70;
NMaxMuc)ii = NMax6f8%NMax6f9"' div 7;
type 6f = "..NMax6f;
NrMuc)ie = "..NMaxMuc)ii;
:raf = array"..7, NrMuc)ie! of NrMuc)ie;
Arbore = array0..NMax6f9"! of NrMuc)ie;
var n: 6f; /: NrMuc)ie;
g::raf; a: Arbore;
c: array6f! of 6f; nr: (ord; fout: text;
procedure ;nitia#i.are;
var i: NrMuc)ie; $: 6f; fin: text;
begin
assign%fin, &ap.in&'; assign%fout, &ap.out&';
re(rite%fout'; reset%fin';
read#n%fin, n, /';
for i := " to / do read#n%fin, g",i!, g7,i!';
for $ := " to n do c$! := $;
c#ose%fin'
end;
procedure ,crieArb;
var i: 6f;
begin
inc%nr';
(rite#n%fout, &Arbore#e &,nr';
for i := " to n9" do
(rite%fout,&&, g",ai!!,&,&,g7,ai!!,&! &';
(rite#n%fout'
end;
procedure <onstrArb%i: 6f';
var $: NrMuc)ie; 4, Nou, 6ec)i: 6f; aux: set of 6f;
begin
if i = n t)en
,crieArb
e#se
for $ := ai9"!=" to / do
if cg", $!! 23 cg7, $!! t)en
-/uc)ia $ nu for/ea.a cic#uri cu ce#e de$a se#ectate0
begin
ai! := $;
-unific co/ponente#e conexe a#e extre/itati#or
/uc)iei $0
aux := !;-retin varfuri#e ce au fost trecute din
co/ponenta conexa 6ec)i in Nou0
Nou := cg", $!!; 6ec)i := cg7, $!!;
for 4 := " to n do
if c4! = 6ec)i t)en
begin
206
c4! := Nou;
aux := aux=4!;
end;
<onstrArb%i="';
-restaure. situatia dinaintea ape#u#ui 0
for 4 := " to n do
if 4 in aux t)en c4! := 6ec)i;
end
end;
begin -progra/ principa# 0
;nitia#i.are;
<onstrArb%"';
c#ose%fout';
end.
program Kruskal;
const NMax6f = 70;
NMaxMuc)ii = NMax6f8%NMax6f9"' div 7;
type 6f = "..NMax6f;
NrMuc)ie = "..NMaxMuc)ii;
Muc)ie = record
e", e7: 6f;
cost: (ord
end;
:raf = arrayNrMuc)ie! of Muc)ie;
Arbore = array"..NMax6f9"! of Muc)ie;
var n, i, /in, /ax, NrM,e#: 6f; 4:Muc)ie;
/: NrMuc)ie;
g::raf; a: Arbore;
c: array6f! of 6f;
procedure ;nitia#i.are;
var i: NrMuc)ie; $: 6f; fis: text;
begin
assign%fis, &>rus4a#.in&'; reset%fis';
read#n%fis, n, /';
for i := " to / do read#n%fis, gi!.e", gi!.e7, gi!.cost';
for $ := " to n do c$! := $;
c#ose%fis'
end;
procedure <o/b?eap%i, /: NrMuc)ie';
var parinte, fiu: NrMuc)ie; v: Muc)ie;
begin
v := gi!;
parinte := i;
fiu := 78i;
()i#e fiu 2= / do
begin
if fiu 2 / t)en
if gfiu!.cost 3 gfiu="!.cost t)en fiu := fiu=";
if v.cost 3 gfiu!.cost t)en
207
begin
gparinte! := gfiu!;
parinte := fiu;
fiu := fiu87;
end
e#se
fiu := /=";
end;
gparinte! := v;
end;
procedure <onstr?eap;
var i: NrMuc)ie;
begin
for i := / div 7 do(nto " do <o/b?eap%i, /';
end;
function /axi/%a, b: (ord': (ord;
begin
/axi/ := a;
if b 3 a t)en /axi/ := b
end;
function /ini/%a, b: (ord': (ord;
begin
/ini/ := a;
if b 2 a t)en /ini/ := b;
end;
procedure Afisare;
var i: 6f; <ostAPM: (ord;
begin
if NrM,e#= n9" t)en
begin
<ostAPM := 0;
(rite#n%&Arbore#e partia# de cost /ini/ este :&';
for i := " to n9" do
begin
(rite#n%&&,ai!.e",&,&,ai!.e7,&! cost=&,ai!.cost';
<ostAPM := <ostAPM=ai!.cost
end;
(rite#n%&<ostu# APM=&,<ostAPM';
end
e#se
(rite#n%&:rafu# nefiind conex nu ad/ite arbori partia#i. &';
read#n
end;
begin -progra/ principa# 0
;nitia#i.are;
<onstr?eap;
()i#e %NrM,e# 2 n' and %/ 3 0' do
begin
-extrag din )eap /uc)ia de cost /ini/0
208
4 := g"!;
g"! := g/!;
dec%/';
<o/b?eap%", /';
if c4.e"! 23 c4.e7! t)en -nu se for/ea.a cic#u0
begin
inc%NrM,e#';
aNrM,e#! := 4;
-contopesc conponente#e conexe a#e extre/itati#or
/uc)iei se#ectate 0
/in := /ini/%c4.e"!, c4.e7!';
/ax := /axi/%c4.e"!, c4.e7!';
for i := " to n do
if ci! = /ax t)en ci! := /in
end
end;
Afisare
end.
program Prim;
const NMax6f = 70;
NMaxMuc)ii = NMax6f8%NMax6f9"' div 7;
;nf = Max@ong;nt;
type 6f = "..NMax6f;
:raf = array6f,6f! of rea#;
var n, r, i, 6fMin: 6f;
:: :raf;
p: array6f! of 0..NMax6f;
A: set of 6f;
4ey: array6f! of rea#;
>eyMin: rea#;
procedure ;nitia#i.are;
var i, $, 4, nrv: 6f; c: rea#;
fin: text;
begin
assign%fin, &pri/.in&'; reset%fin';
read#n%fin, n, r';
for i := " to n do
for $ := " to n do
:i,$! := ;nf;
for i := " to n do
begin
:i,i! := 0;
read%fin, nrv'; -nrv9nu/aru# de varfuri adiacente cu i0
for $ := " to nrv do
begin
-citesc varfuri#e adiacente cu i si costuri#e
/uc)ii#or corespun.atoare0
read%fin, 4, c';
:i,4! := c;
end;
read#n%fin';
209
end;
for i := " to n do
begin
4eyi! := :r, i!;
pi! := r
end;
A := "..n!9r!; pr! := 0;
c#ose%fin';
end;
procedure AfisareAPM;
var i: 6f; cost: rea#;
begin
cost := 0;
(rite#n%&Muc)ii#e APM sunt: &';
for i := " to n do
if i 23 r t)en
begin
(rite%&&,pi!,&,&,i,&! &';
cost := cost=:i,pi!!;
end;
(rite#n;
(rite#n%&<ostu# APM &, cost:7:7';
read#n
end;
begin
;nitia#i.are;
()i#e A 23 ! do
begin
>eyMin := ;nf; -deter/in nodu# din A de c)eie /ini/a0
for i := " to n do
if %i in A' and %>eyMin 3 4eyi!' t)en
begin
>eyMin := 4eyi!;
6fMin := i
end;
A := A96fMin!;
for i := " to n do -actua#i.e. c)ei#e varfuri#or din A0
if %i in A' and %:i, 6fMin! 2 4eyi!' t)en
begin
pi! :=6fMin;
4eyi! := gi, 6fMin!
end
end;
AfisareAPM
end.
program Arbori_Partiali_BF_DF;
const NrMax6f = 70;
type 6f = 0..NrMax6f;
@ista = ^Nod@ista;
210
Nod@ista = record
inf: 6f;
ur/: @ista;
end;
:raf = array6f! of @ista;
Arbore = array6f! of 6f;
var n: 6f;-nu/aru# de varfuri din graf0
s: 6f;-varfu# sursa0
:: :raf;
AB, A*: Arbore;-arborii partia#i obtinuti prin parcurgere
B+, respectiv *+0
6: array6f! of boo#ean;
procedure ;nitia#i.are;
var fin: text; i, $: 6f; p: @ista;
begin
assign%fin, &graf.in&'; reset%fin';
read#n%fin ,n'; read#n%fin, s';
for i := " to n do
begin
:i! := ni#; 6i! := fa#se;
()i#e not see4eo#n%fin' do
begin
read%fin, $';
ne(%p'; p^.inf := $;
p^.ur/ := :i!; :i! := p;
end;
read#n%fin';
end;
6s! := true;
c#ose%fin';
end;
procedure *+,%x: 6f';
var 1: @ista;
begin
1 := :x!;
()i#e 1 23 ni# do -parcurg #ista de adiacenta a #ui x0
begin
if not 61^.inf! t)en -varfu# 1^.inf este nevi.itat0
begin
61^.inf! := true; A*1^.inf! := x;
*+,%1^.inf';
end;
1 := 1^.ur/;
end;
end;
procedure B+,;
type <oada = ^Nod<oada;
Nod<oada = record
inf: 6f;
ur/: <oada
end;
211
var <, ,f<: <oada;
1: @ista; x: 6f;
p: <oada;
begin -initia#i.e. coada0
ne(%<'; <^.inf := s; <^.ur/ := ni#; ,f< := <;
for x := " to n do 6x! := fa#se; 6s! := true;
()i#e < 23 ni# do
begin
x := <^.inf;-pri/u# varf din coada0
1 := :x!;
()i#e 1 23 ni# do -parcurg #ista de adiacenta a #ui x0
begin
if not 61^.inf! t)en -varfu# 1^.inf nevi.itat0
begin
61^.inf! := true; AB1^.inf! := x;
-insere. 1^.inf in coada0
ne(%p'; p^.inf := 1^.inf;
p^.ur/ := ni#; ,f<^.ur/ := p; ,f< := p;
end;
1 := 1^.ur/;
end;
p := <; < := <^.ur/;
dispose%p';-a/ extras din coada vafu# x0
end;
end;
procedure AfisareArbore%A: Arbore';
var i: 6f;
begin
for i := " to n do
if Ai! 23 0 t)en (rite%&&,i,&,&,Ai!,&! &';
(rite#n;
end;
begin -progra/ principa#0
;nitia#i.are;
*+,%s';
B+,;
(rite#n%&Arbore#e partia# *+, este:&';
AfisareArbore%A*';
(rite#n%&Arbore#e partia# B+, este:&';
AfisareArbore%AB';
read#n;
end.
program Componente_Biconexe;
const NMax6f = 70;
type 6f = 9"..NMax6f;
,tiva = ^Nod,tiva;
Nod,tiva = record
f, t: 6f;
ur/: ,tiva
212
end;
@ista = ^Nod@ista;
Nod@ista = record
v: 6f;
#eg: @ista;
end;
:raf = array0..NMax6f! of @ista;
var ,: ,tiva; :: :raf;
#o(, dfn: array0..NMax6f! of 6f;
nr, n, sursa:6f; nu/: 0..NMax6f;
procedure ;nitia#i.are;
var ns: 6f; i, $: 6f; p: @ista; fin: text;
begin
assign%fin, &biconex.in&'; reset%fin';
read#n%fin, n'; read#n%fin, sursa';
for i := 0 to n do
begin
:i! := ni#;
read#n%fin, ns';
for $ := " to ns do
begin
ne(%p';
read%fin, p^.v';
p^.#eg := :i!; :i! := p;
end;
read#n%fin';
dfni! := 9"
end;
c#ose%fin';
ne(%,'; ,^.f := sursa; ,^.t := 9"; ,^.ur/ := ni#;
end;
procedure AfisareC<o/pCBiconexa%x, u: 6f';
var p: ,tiva; a, b: 6f;
begin
inc%nr';-nr9nu/aru# de co/ponente biconexe0
(rite#n%&/uc)ii#e co/ponentei biconexe &,nr,& sunt:&';
repeat
p := ,; a := p^.t; b := p^.f; , := ,^.ur/;
(rite%&%&,a,&,&,b,&' &';
dispose%p';
unti# %a = u' and %b = x';
(rite#n
end;
function /in %a, b: 6f': 6f;
begin
if a 2 b t)en /in := a
e#se /in := b
end;
procedure Biconex%u, tu: 6f';
-ca#cu#ea.a dfn si #o( si afisea.a co/ponente#e biconexe0
213
var p: @ista; 1: ,tiva; x: 6f;
begin
dfnu! := nu/; #o(u! := dfnu!; inc%nu/';
p := :u!;
()i#e p 23 ni# do -parcurg #ista de adiacenta a #ui u0
begin
x := p^.v;
if %x 23 tu' and %dfnx! 2 dfnu!'t)en
begin-inserea.a in stiva , /uc)ia%u,x'0
ne(%1'; 1^.f := x; 1^.t := u;
1^.ur/ := ,; , := 1;
end;
if dfnx! 2 0 t)en -x nu a /ai fost vi.itat0
begin
Biconex %x, u';
#o(u! := /in%#o(u!, #o(x!';
if #o(x! 3= dfnu! t)en -u punct de articu#atie;
a/ identificat o co/ponenta biconexa, ce
contine /uc)ii#e din stiva , pana #a %u,x'0
AfisareC<o/pCBiconexA%x,u';
end
e#se
if x 23 tu t)en #o(u! := /in%#o(u!, dfnx!';
p:=p^.#eg
end;
end;
begin -progra/ principa#0
;nitia#i.are;
Biconex%sursa, 9"';
read#n
end.
214