Sunteți pe pagina 1din 120

CUPRINS

Introducere____ ___________ ___________ __________ __________ _____________- 3 -

/ - Noţiuni introductive___________________________________________________-4-
1.1. Graf. Noţiuni fundamentale -4-
*■
1.2. Drumuri şi circuite în grafuri____________________________________________- 8 -
1.3. Graf neorientat________________________________________________________- 9 -
1.4. Grafuri conexe, tare conexe, graf bipartit________________________________- 10 -
1.5. Gradul unui vârf a unui graf___________________________________________- 12 -
1.6. Arbore şi pădure_____________________________________________________- 12 -
1.7. Matrice ataşate grafurilor_____________________________________________- 13 -

II - Algoritmi pentru determinarea drumurilor optime într-un graf _____________________________-17 -


2.1. Algoritmul lui Ford simplificat_________________________________________- 17 -
2.2. Algoritmul Ford generalizat___________________________________________- 19 -

III - Determinarea drumurilor hamiltoniene___________________________________________________________-20 -


3.1. Algoritmul lui Chen pentru determinarea drumurilor hamiltoniene în grafuri cu
circuite_________________________________________________________________- 21 -
3.2. Algoritmul lui Kaufmann______________________________________________- 25 -
3.3. Un algoritm bazat pe algoritmul ungar__________________________________- 26 -

IV - Algoritmi pentru determinarea arborilor de lungime optimă într-un graf ______________- 28 -


4.1. Algoritmul lui Prim__________________________________________________- 28 -
4. 2. O variantă a algoritmului lui Kruskal___________________________________- 33 -

V- Aplicaţii ale grafurilor_____________________________________________________________________________________ -37 -

Bibliografie -52-
Introducere

Termenul de „graf’ are cu totul altă semnificaţie decât cel de grafic. Prima lucrare de teoria
graiurilor a fost scrisă de renumitul matematician elveţian Euler, în 1736, în scopul rezervării unor
jocuri şi amuzamente matematice. Dezvoltarea ulterioară a matematicii şi în special a aplicaţiilor ei
în diferite domenii ştiinţifice a dat un impuls puternic dezvoltării teoriei graiurilor. Utilizarea ei în
domenii variate, teoretice sau practice, de la probleme economice la fundamentarea deciziilor
politice, de la studiul reţelelor electrice la critica textelor, etc., îi conferă în zilele noastre o
importanţă aparte.
în general, pentru situaţiile care necesită la rezolvare un oarecare efort mintal (şi un caz
tipic este cel al celor din economie), se caută, în primul rând, o metodă de reprezentare a lor care să
permită receptarea întregii probleme dintr-o privire (pe cât posibil) şi prin care să se evidenţieze cât
mai clar toate aspectele acesteia. în acest scop se folosesc imagini grafice gen diagrame, schiţe,
grafice etc.
Lucrarea de faţă îşi propune să prezinte câteva dintre cele mai importante noţiuni legate de
algoritmi pentru determinarea drumului optim în graf. Lucrarea este structurată pe cinci capitole.
în capitolul 1 sunt prezentate noţiunile introductive referitoare la graiuri neorientate şi
graiuri orientate ce vor fi utilizate nemijlocit în celelalte părţi ale lucrării. Sunt prezentate noţiunile
de graf neorientat, graf orientat, lanţ, drum, ciclu, circuit, grad, graf parţial, subgraf, conexitate, tare
conexitate, arbore, graf ponderat, arbore parţial, arbore parţial de cost minim, graf hamiltonian,
graf eulerian, graf bipartit, matrice ataşată graiurilor, arbore, pădure.
în capitolul 2 sunt prezentaţi algoritmul lui Ford simplificat si algoritmul lui Ford
generalizat.
Capitolul 3 conţine algoritmi pentru determinarea drumurilor hamiltoniene din care sunnt
prezentati, algoritmul lui Chen, algoritmul lui Kaufinann si un algoritm bazat pe algoritmul
ungar.
Capitolul 4 sunt prezentati algoritmii pentru determinarea arborilor de lungime optima fiind
specificaţi algoritmul lui Prim si o varianta a altgoritmului lui Kruskal.
Capitolul 5 conţine aplicaţii ale graiurilor, precum şi probleme rezolvate în limbajul de
programare C++. Problemele au fost alese spre a permite aprofimdarea teoriei şi spre a edifica
tehnici cu caracter de generalitate.
I - Noţiuni introductive
9

1.1. Graf. Noţiuni fundamentale


9
O reprezentare dintre cele mai utilizate este cea prin graiuri . Acestea sunt utilizate în
special pentru vizualizarea sistemelor şi situaţiilor complexe. în general, vom reprezenta
componentele acestora prin puncte în plan iar relaţiile (legăturile, dependenţele, influenţele, etc)
dintre componente prin arce de curbă cu extremităţile în punctele corespunzătoare. între două
puncte pot exista unul sau mai multe segmente (în funcţie de câte relaţii dintre acestea, care ne
interesează, există) iar segmentelor li se pot asocia sau nu orientări (după cum se influenţează cele
două componente între ele), numere care să exprime intensitatea relaţiilor dintre componente etc.
Este evident, totuşi, că această metodă are limite, atât din punct de vedere uman (prea multe
puncte şi segmente vor face desenul atât de complicat încât se va pierde chiar scopul pentru care a
fost creat - claritatea şi simplitatea reprezentării, aceasta devenind neinteligibilă) cât şi din punct de
vedere al tehnicii de calcul (un calculator nu poate "privi" un desen ca un om).
Din acest motiv, alături de expunerea naiv-intuitivă a ceea ce este un graf, dată mai sus, se
impune atât o definiţie riguroasă cât şi alte modalităţi de reprezentare a acestora, adecvate în
general rezolvărilor matematice.

Fie X o mulţime finită şi nevidă de elemente. Notăm cu P(X) mulţimea părţilor


(submulţimilor) lui X.
Definiţia 1.1.1. Numim graf perechea (X, F), unde F: X—> P(X). Vom nota G =(X, F),
elementele lui X se vor numi vârfuri, iar perechile (xj, Xj), unde xje Fxj, se vor numi arce. Vârfurile
Xi şi xj sunt extremităţile arcului (xj, xj).
Putem da pentru graf şi următoarea definiţie echivalentă
Definiţia 1.1.2. [vezi(l)] Numim graf perechea (X, T), unde TcXxX, adică o mulţime de
perechi ordonate sau nu de elemente din X.
Dacă X este o mulţime finită, atunci graficul (X, T) se numeşte graf finit, în caz contrar se
zice că avem un graf infinit.
Exemplul 1.1.1. Fie X={xj, X2, X3, X4} şi F aplicaţia definită astfel:
Fxi={x2, X4}, Fx2={xi, x2}, Fx3={x4}, Fx4=0. Atunci G =(X, F) este un graf.
Un graf G =(X,F) se poate reprezenta geometric în felul următor:
a) Fiecare vârf este reprezentat printr-un punct din plan
b) Fiecare arc (xj, xj), unde xje Fxj se reprezintă printr-o linie (dreaptă sau curbă)
care uneşte cele două extremităţi şi pe care se află o săgeată cu sensul de la x; la
Xj (vezi Figura 1.1.1.). Dacă x\ coincide cu Xj, zicem că avem o buclă.

Figura 1.1.1.

Astfel graful din Exemplul 1.1.1. este reprezentat în Figura 1.1.2. a.


Exemplul 1.1.2. Fie X = { xi, X2, x3, X4, X5} şi F: X—> P(X), dată prin Fxi={x2j x3 x5;},
Fx2={x3, X4}, Fx3={x5}) Fx4={x4, X5}j Fx5={xi, x2}. Atunci graful G=(X, F) este reprezentat în
Figura 1.1.2.b.

Figura
1.1.2.

Observaţia 1.1.1. Având dat un graf G=(X, F), se poate defini aplicaţia F' 1: X- P(X),
luând
F_1Xj={xîG X | xje Fxi}, pentru XjG X.
Astfel pentru graful din Exemplul 1.1.1., avem:
F^xi = {x2}, F‘‘x2={xi, x2}, F_ix3 = 0, F1x4={xi,x3}.
Pentru graful din Exemplul 1.1.2. avem:

-5-
F^Xj = {x5}, F' x ={xj, x5}, F'Ix =={xhx2}, F' x ={x2, X4}, F*x ={xi, X ,X4}.
1
2 3
1
4 5 3

Definiţia 1.1.3. Elementele mulţimii Fx, se numesc succesorii (urmaşii) lui Xj, iar
elementele lui se numesc predecesorii lui Xj. Un vârf se numeşte izolat dacă Fxk= F'lXk=0.
Bucla este (Xj, Xi), deci extremitatea iniţială coincide cu extremitatea finală a arcului.
Arcele adiacente sunt acelea care au o extremitate comună. Vârfurile adiacente sunt
acelea care sunt legate printr-un arc.
Exemplul 1.1.3. în Exemplul 1.1.2. succesorii lui x sunt X3 şi X4, iar ai lui X5 sunt xi şi
2

x2. Predecesorii lui x sunt Xj şi X5, iar ai lui X5 sunt xi, X3 şi X5.
2

Arcele (xj, X3) şi (x3, X5) sunt adiacente. La fel, arcele (xi, X5) şi (X3, X5) sunt
adiacente. Arcul (X4, X4) este o buclă. Vârfurile x şi x sunt adiacente.
2 3

Definiţia 1.1.4. Mulţimea arcelor cu extremitatea iniţială Xj, notată U*, se numeşte

mulţimea arcelor incidente spre exterior vârfului x(-, deci

U* ={(Xj, xj) | xjG Fxi}, pentru fiecare x;e X.

Mulţimea arcelor incidente spre interior vârfului x { se va nota U~, deci

U~ = {(xk, Xj) | x;G Fxk}= { xk, Xj) | xkG F ~ l x i} pentru XiG X.

Atunci U x =U* u U ~ este mulţimea arcelor incidente vârfului Xj.


Exemplul 1.1.4. în graful din Exemplul 1.1.2. avem:
U*. X
2)> (Xl, X3), (Xi, x5)}, U~= {(x5, X])},
^={(xu x2), (Xj, X3), (Xi, X5), (x5, Xi)}.

La fel

U*4 ={(X4, X4), (X4, x5)}, £/■ - {(x2, X4), (X4,X4)},


u
XA
={(x2, X4), (X4, X4), (X4, x5)}.
Definiţia 1.1.5. Un graf G=(X, F), se numeşte simetric, dacă oricare ar fi arcul (xj, xj)
există şi arcul (xj, Xi).
Graful este antisimetric, dacă oricare ar fi (x,, Xj) nu există arcul (xj, x,).
Graful este asimetric dacă există cel puţin o pereche de vârfuri xi şi xj pentru care
există numai unul din arcele (xb Xj), (Xj, Xi).
Exemplul 1.1.5. Graful Gi=(X], Fi), este simetric, apoi graful G =(X2, F2), este2

antisimetric, iar graful G =(X3, F3) în, este asimetric.


3

Aici
Xi={x], x2, x3, X4, x5}, X ={xi, x2, x3, X4, x5, x6},
2

Iar funcţia Fi: Xi—► P(Xj) este dată prin

-6-
FlXi= {x2, x3}, F!X2= {xh X4}, FiX3= {x1} X4}, FiX4= {x2, x3, x5}, F,x5=
{X4}. Apoi, F2: X2—> P(X2) este dată prin F2xi= {x2}, F2x2= {x3, x6}, F2x3= {X4,
x6}, F2X4= {x5}, F2x5= 0, F2x6= {X4}. respectiv F3: X|—► P(Xi) este dată prin
F3xi= {x2, x3}, F3x2= {x3, X4}, F3x3= {x2, x5}, F3X4= {xi, x3}, F3x5= 0.
Astfel grafurile din Exemplul 1.1.5. sunt reprezentate în Figura 1.1.3.

Figura 1.1.3.

Definiţia 1.1.5. Fie G=(X, F) un graf. Se numeşte graf parţial al grafului dat, un graf
G]=(Xi, Fi), unde FjXjC Fxi adică Gi se obţine din G prin suprimarea unor anumite arce.
Subgraful este graful G2=(X2, F2), unde X2<zX, iar F2 este dată prin F2Xj = X2nFx{,
adică G2 se obţine din G prin suprimarea unor anumite vârfuri şi a arcelor incidente acestora.
Subgraful parţial este graful G3=(X3, F3), unde X3cX şi F3Xj<= F2Xj, adică se obţine prin
suprimarea unor vârfuri şi a mai multor arce decât cele incidente acestora.
Exemplul 1.1.6. Graful din Figura 1.1.4.a este un graf parţial al celui din Figura
1.1.4. b, iar graful din Figura 1.1.4.c un subgraf.

-7-
J


b 5 X,
a c
Figu
ra
1.1.
4.

E
xem
plul
1.1.
7.
Con
side
răm
graf
ul
G=(
X,
F),
und
e
mul
ţime
a
vârf
uril
or
este
X={
xi,
X2,

X3,

X4,

X5,

X6,

X7} şi

FX]
=
{X2,

X3,

X4}

-8-
,
Fx2
={x
3 ,
X4},

Fx3
={x
4,
x5},

FX4
={X
6 ,
x7},
FX5
={X
6 ,
x7},

FX6
={X
7 },
FX7
= 0.
Atu
nci
Gi=
(X,
Fi),
este
un
gra
f
par
ţial
und
e Fi
este
defi
nită
pri
n
FXI
={X
2 ,
X4},

FX2
={
X4},

FX3
={ x
},
5

Fx4

={ x7

},

FX5
={X
6 },
FX6
={X
7 },
FX7
= 0,
dec
i au
fost
sup
rim
ate
arc
ele
(xi,
x3),
(x2,
x3),
(x3,

-10-
X4),

(X4
,
xg)
şi
(X5,

x7).
D
e
ase
me
nea
,
G2=
(X2,
F2),
este
un
sub
graf
,
dac
ă
mul
ţim
ea
vârf
uril
or
este
X=
{ xi
, x2,
X4,
X5,
x7},
iar
F2
este
dat
ă
prin
F2x
i={
x2,
X4
},
F2x
2={
X4
},
F2X
4={
x7},
F2x
5={
x7},
F2x
7=
0,
dec
i au
fost
sup
rim
ate
vârf
uril
e x3
şi
X6,
cu
arc
ele

-12-
inci
den
te
lor.
Sub
graf
ul
parţi
al
G3=
(X2,
F3),
und
e X2
este
ca
mai
sus,
iar
F3
este
dată
prin
F3xi
={x2
, X4},
F3x2
={
X4}
,
F3X
4={
x7},
F3x5
=F3
x7=
0.
A
stfe
l
X5
a
dev
enit
un
vârf
izol
at,
iar
G3
s-a
obţi
nut
din
sub
graf
ul
G2
prin
sup
rim
are
a
arc
ului
(xs,
x7).

1.2. D
rum
uri
şi
circ
uite
în
graf
uri

F
ie
G=(
X,
F)
un

-14-
graf
.
D
efin
iţia
1.2.
1.
Se
nu
meş
te
dru
mo
suc
cesi
une
de
arc
e,
adi
ace
nte
dou
ă
câte
dou
ă,
la
fel
orie
ntat
e,
la
car
e
extr
emi
tate
a
fina
lă a
unu
i
arc
coi
nci
de
cu
extr
emi
tate
a
iniţi
ală
a
arc
ului
pre
ced
ent.
C
irc
uit
ul
este
im
dru
m
înc
his,
adi

extr
emi

-16-
tate
a
fina
lă a
unu
i
arc
coi
nci
de
cu
extr
emi
tate
a
iniţi
ală
a
pri
mul
ui
arc.
O
bse
rvaţ
ia
1.2.
1.
[ve
zi(l
)]
Pre
ciza
rea
dru
mur
ilor
şi
circ
uite
lor
se
fac
e
indi
cân
d
vârf
uril
e
prin
car
e
trec
arc
ele
car
e le
con
stit
uie
sau
me
nţio
nân
d
arc
ele
din
car
e
sun
t
co

-18-
mp
use.
Exe
mpl
ul
1.2.
1.
într
-un
graf
G
put
em
con
side
ra
urm
ăto
arel
e
dru
mur
i:
dt=(xi, x3, X4, x2) între xi
şi x2, şi d2=(xi, x2, x3, X4,
x2, x5) între xj şi x5,
resp
ecti
v
circ
uitel
e:
Ci=(
x2,
X3,
X4,
x2)
între
x2 şi
x2,
şi
c2=(
xi,
x2,
x3,
X4,
x5,
x6,
x7,
xi)
între
xi şi
xi.
D
efin
iţia
1.2.
2.
Nu
măr
ul
de
arce

-20-
dint
r-un
dru
m
se
num
eşte
lun
gim
ea
lui.
D
efin
iţia
1.2.
3.
Un
dru
m
este
ele
me
nta
r
dac
ă
fiec
are
vârf
al
său
este
folo
sit o
sing
ură
dată
. în
caz
con
trar,
dru
mul
său
este
nee
lem
ent
ar.
U
n
dru
m
este
sim
plu
dac
ă
folo
seşt
e
fiec
are
arc
al
său
o
sing
ură
dată
. în
caz
con
trar,

-22-
dru
mul
este
co
mp
us.
I
ntr-
un
graf
,
dru
mul
ha
milt
oni
an
este
un
dru
m
ele
me
ntar
,
care
trec
e
prin
toat
e
vârf
uril
e
graf
ului
, iar
un
dru
m
eul
eri
an
este
acel
a
care
este
sim
plu
şi
folo
seşt
e
toat
e
arce
le
graf
ului
.
A
cest
ea
pot
fi
spus
e şi
des
pre
circ
uie.
D
efin

-24-
iţia
1.2.
4.
Se
nu
meş
te
gra
f
ha
milt
oni
an
un
graf
care
con
ţine
un
circ
uit
ha
milt
oni
an,
iar
gra
f
eul
eri
an
un
graf
care
con
ţine
un
circ
uit
eule
rian
.
E
xe
mpl
ul
1.2.
2.
Dru
mul
dl
din
Exe
mpl
ul
1.2.
1.
este
ele
me
ntar
,
dru
mul
d2
este
sim
plu,
dar
neel
eme
ntar
.
Un

-26-
dru
m
co
mp
us
este
urm
ător
ul
d3~
(x],
x2,
X3,
X4,
x2,
X3,
Xs).
î
n
graf
ul
din
Fig
ura
1.2.
1.a,
dru
mul
d}=
(xi,
X5,

X4,

x2,
X3)

este
ha
milt
oni
an,
iar
circ
uitu
l
C3
=(xi
, x5,
X4,

x2,
X3,

xi)
este
ha
milt
oni
an.
î
n
graf
ul
din
Fig
ura
1.2.
l.b,
dru
mul
d5=
(xi,
x2,
X4,

X3,

X2,

X5,

x$,

-28-
X4)

este
eule
rian
.

Figu
ra
1.2.
1.

1.3. G
raf
neor
ient
at

P
rin
Def
iniţi
a
1.1.
1.
am
intr
odu
s
noţi
une
a de
graf
.
Apl
icaţ
ia
F, o
repr
eze
ntar
e
geo
met
rică
,
era
ilus
trat
ă
prin
seg
me
nte
orie
ntat
e.
Dac
ă se
face
abst
racţ
ie
de
orie
ntar
e,
se
va
aju

-30-
nge
la
aşa
zise
le
con
cept
e
neo
rien
tate.
în
ace
st
caz,
vo
m
ave
a
cor
esp
ond
enţe
le:
mu
chie
în
l
oc
de
ar
c,
la

în
lo
c
de
dr
um
,
ci
cl
u
în
lo
c
de
ci
rc
ui
t.
Ex
is

ca
zu
ri

nd
do


rf
ur
i
su
nt
le
ga
te
pr
in
do

sa
u
ma
i
mu

-32-
lt
e
mu
ch
ii
.
El
e
se
vo
r
nu
mi
mu
ch
ii
mu
lt
ip
le
.
N
otă
m
graf
ul
neo
rien
tat
prin
G=(
X,
U),
und
e X
este
mul
ţim
ea
vârf
uril
or,
iar
U
este
mul
ţim
ea
mu
chii
lor.
U
n
graf
neor
ient
at
se
num
eşte
sim
plu
dac
ă nu
conţ
ine
bucl
e şi
muc
hii
mul
tiple
.
N
oţiu
nile
de
graf
parţ
ial,

-34-
sub
graf
şi
sub
raf
parţ
ial
se
pot
intr
odu
ce
şi
aici,
prin
anal
ogi
e cu
Def
iniţi
a
1.1.
5.
O
bser
vaţi
a
1.3.
1.
Vor
exis
ta
situ
aţii
cân
d
un
graf
deşi
orie
ntat
,
pen
tru
anu
mit
e
con
side
rent
e,
se
va
con
side
ra
neo
rien
tat.
E
xe
mpl
ul
1.3.
1.
în
Fig
ura
1.3.
1.a
mu
chia
(xj,
x2)

-36-
este
dub
lă,
în
Fig
ura
1.3.
1.b
ave
m
un
graf
sim
plu.

b
a

Figu
ra
1.3.
1,

1.4. G
rafu
ri
con
exe,
tare
con
exe,
graf
bipa
rtit

D
efin
iţia
1.4.
1.
Un
graf
G=(
X,
F),
orie
ntat
sau
G=(
X,
U)
neo
rien
tat,
se
nu
meş
te
con
ex
dac
ă
într
e
oric
e
per
ech
e de
vârf
uri
exis

un

-38-
lanţ
.
G
rafu
l
orie
ntat
G=(
X,
F)
se
nu
meş
te
tar
e
con
ex
dac
ă
într
e
oric
e
per
ech
e de
vârf
uri
exis

un
dru
m.
O
bser
vaţi
a
1.4.
1.
[ve
zi(l)
]
Dac
ă un
graf
nu
este
con
ex,
atu
nci
se
poa
te
con
side
ra
sub
graf
ele
con
exe
din
care
este
for
mat
, pe
care
le
vo
m
nu

-40-
mi
co
mp
one
nte
con
exe.
E
xe
mpl
ul
1.4.
1.
în
Fig
uril
e
1.4.
1.a
şi
1.4.
1 .b
ave
m
repr
eze
ntat
e
geo
met
ric
graf
uri
con
exe.
în
Fig
ura
1.4.
l.c
este
repr
eze
ntat
un
graf
tare
con
ex,
iar
în
Fig
ura
1.4.
1.d
un
graf
nec
one
x,
cu
dou
ă
co
mp
one
nte
con
exe.

-42-
]

F
i
g
u
r
a

1
.
4
.
1
.

D
e
f
i
n
i
ţ
i
a
1
.
4
.
2
.
U
n
v
â
r
f
a
l
g
r
a
f
u
l
u
i
c
o
n
e
x
s
e
n
u
m
e
ş
t
e
p
u
n
c
t
d
e
-44-
a
r
t
i
c
u
l
a
ţ
i
e

d
a
c
ă
p
r
i
n
s
u
p
r
i
m
a
r
e
a
l
u
i
g
r
a
f
u
l
d
e
v
i
n
e
c
o
n
e
x
.
A
n
a
l
o
g
s
e
d
e
fi
n
e
ş
t
e
m
u

i
m
e
a
d
-46-
e
a
rt
i
c
u
l
a
ţi
e
.
P
u
n
t
e
a
e
s
t
e
a
r
c
u
l
p
ri
n
s
u
p
ri
m
a
r
e
a
c
ă
r
u
i
a
g
r
a
f
u
l
d
e
v
i
n
e
n
e
c
o
n
e
x
.
E
x
e
m
p
l
u
l
1
.
4
.
-48-
2
.
î
n
g
r
a
f
u
l
r
e
p
r
e
z
e
n
t
a
t
î
n
F
i
g
u
r
a
1
.
4
.
1
.
a
v
â
r
f
u
l
X
5
e
s
t
e
p
u
n
c
t
d
e
a
r
t
i
c
u
l
a
ţ
i
e
.
M
u
l
ţ
i
m
e
a
{
-50-
x
2
,
X
4
}
e
s
t
e
m
u
l
ţ
i
m
e
d
e
a
r
t
i
c
u
l
a
ţ
i
e
î
n
g
r
a
f
u
l
d
i
n
F
i
g
u
r
a
1
.
4
.
1
.
b
.
A
r
c
u
l
(
X
4
,
x
5

)
e
s
t
e
o
p
u
n
t
-52-
e
î
n
g
r
a
f
u
l
d
i
n
F
i
g
u
r
a
1
.
4
.
2
.,
d
e
o
a
r
e
c
e
p
r
i
n
s
u
p
r
i
m
a
r
e
a
l
u
i
s
e
o
b
ţ
i
n
e
u
n
g
r
a
f
c
o
n
e
x
.

-54-
F

-
-56-
D
e
f
i
n
i
ţ
i
a

1
.
4
.
3
.
S
e

n
u
m
e
ş
t
e

g
r
a
f

b
i
p
a
r
t
i
t

u
n

g
r
a
f

(
X
,
U
)

î
n

c
a
r
e

m
u
l
ţ
i
m
e

-58-
a

n
o
d
u
r
i
l
o
r

p
o
a
t
e

f
i

î
m
p
ă
r
ţ
i
t
ă

î
n

d
o
u
ă

m
u
l
ţ
i
m
i

d
i
s
j
u
n
c
t
e

ş
i

a
s
t
f
e
l

î
n
c

-60-
â
t

o
r
i
c
e

a
r
c

a
r
e

e
x
t
r
e
m
i
t
a
t
e
a

i
n
i
ţ
i
a
l
ă

î
n

ş
i

c
e
a

f
i
n
a
l
ă

î
n

B
.

1.5.
G
r
a
d
u
l
u
n
u
i
v
â
r
f
a

u
n
-62-
u
i
g
r
a
f

D
e
f
i
n
i
ţ
i
a

1
.
5
.
1
.
G
r
a
d
u
l

u
n
u
i

g
r
a
f

e
s
t
e

e
g
a
l

c
u

n
u
m
ă
r
u
l

m
u
c
h
i
i
l
o
r

i
n
c
i
d
e
n
t
-64-
e

c
u

v
â
r
f
u
l

ş
i

s
e

n
o
t
e
a
z
ă

d
(
x
)
.
U
n

v
â
r
f

c
u

g
r
a
d

1
,
s
e

n
u
m
e
ş
t
e

v
â
r
f

t
e
r
m
i
n
a
l
.
-66-
U
n

v
â
r
f

d
e

g
r
a
d
u
l

s
e

n
u
m
e
ş
t
e

v
â
r
f

i
z
o
l
a
t
.
N
u
m
ă
r
u
l

o
(
G
)
=
m
i
n
{
d
(
x
)

|
x
e

X
}

s
e

-68-
n
u
m
e
ş
t
e

g
r
a
d
u
l

m
i
n
i
m

a
l

l
u
i

n
u
m
ă
r
u
l
D
(
G
)
=

m
a
x
{
d
(
x
)

|
x
e

X
)

s
e

n
u
m
e
ş
t
e

g
r
a
d
u
-70-
l

m
a
x
i
m

a
l

l
u
i

G
.
D
a
c
ă

t
o
a
t
e

v
â
r
f
u
r
i
l
e
l
u
i

G
,
a
u

a
c
e
l
a
ş
i

g
r
a
d

k
,
a
t
u
n
c
i

e
s
t
e

-72-
k

r
e
g
u
l
a
r
.

U
n

g
a
r
f

3
-
r
e
g
u
l
a
r

e
s
t
e

n
u
m
i
t

c
u
b
i
c
.

Grafic cubic (Graful lui Petersen)

M
e
d
i
a

g
r
a
d
u
r
i
l
o
r

u
n
u
i
g
r
a
f
G

s
e

n
o
t
e
a
z
ă

c
u

d
(
G
)
-

-74-
J
]
d
(
x
)
s
a
u

s
e

m
a
i
a
f
l
ă

p
r
i
n

c
a
t
u
l
x xeX
d
i
n
t
r
e

n
u
m
ă
r
u
l
m
u
c
h
i
l
o
r
ş
i
n
u
m
ă
r
u
l
v
â
r
f
u
r
i
l
o
r
î
n
m
u
l
ţ
i
t
c
u

2
.
N
u
-76-
m
ă
r
u
l
v
â
r
f
u
r
i
l
o
r
d
e

g
r
a
d

i
m
p
a
r
e
s
t
e

p
a
r
.
L
a

g
r
a
f
u
r
i
l
e

o
r
i
e
n
t
a
t
e

u
n

v
â
r
f
p
o
a
t
e

a
v
e
-78-
a

d
o
u
ă

t
i
p
u
r
i
d
e

g
r
a
d
e
.

G
r
a
d
u
l
e
x
t
e
r
i
o
r

n
o
t
a
t
c
u

d
+

(
x
)
n
u
m
ă
r
u
l
a
r
c
e
l
o
r
d
e

f
o
r
m
a

(
x
,
y
)
,
y
e

X

G
r
a
d
u
l
i
n
t
e
r
i
o
r

n
o
t
a
t
c
u

d
'
(
x
)
n
u
m
-80-
ă
r
u
l
a
r
c
e
l
o
r
d
e

f
o
r
m
a

(
y
,
x
)
,
y
e

1.6.
A
r
b
o
r
e

ş
i
p
ă
d
u
r
e

D
e
f
i
n
i
ţ
i
a
1
.
6
.
1
.
S
e

n
u
m
e
ş
t
e

a
r
b
o
r
e

u
n

g
r
a
f

c
o
n
e
x

-82-
ş
i

f
a
r
ă

c
i
c
l
u
r
i
.
S
e

n
u
m
e
ş
t
e

p
ă
d
u
r
e

u
n

g
r
a
f

n
e
c
o
n
e
x

ş
i

f
a
r
ă

c
i
c
l
u
r
i
.

-84-
Arborescenta este un arbore orientat care are un vârf si numai unul- rădăcina- fară
predecesori, în rest fiecare vârf are exact un predecesor. Vârfurile care nu au predecesori sunt
puncte terminaleisuspendate).
Exemplul 1.6.1. în Figura 1.6.1.a este reprezentat un arbore, iar în Figura 1.6.1.b o
pădure. în Figura 1.6.2. este reprezentată o arborescenţă cu rădăcina xi şi cu vârfurile suspendate
X3, X4, X7, xg.
Observaţia 1.6.1. Orice arbore cu n vârfuri poate fi transformat, prin orientarea
convenabilă a muchiilor, în arborescenţe, unde pe rând fiecare vârf este rădăcina arborescenţei.

Figura 1.6.2.

1.7. Matrice ataşate graiurilor

Dacă numărul de vârfuri ale unui graf este mare, atunci reprezentarea geometrică devine
greoaie. De aceea, s-au căutat alte modalităţi de reprezentare. Cea mai convenabilă s-a dovedit a
fi cea cu ajutorul matricelor.

Definiţia 1.7.1. Matricea de incidenţă. Fie G = (X, U) un graf neorientat cu n vârfuri,


mulţimea acestora fiind X={ xi, X2..xn}, şi m muchii, mulţimea acestora fiind U={ U], U2...,
Um} •

-85-
Construim matricea S=(sij)i=LiL, numită matrice de incidenţă, unde elementul Sy este
j-l,m
dat prin
1, dacă Xj este extremitate a lui Uj,
s;; =
,J
[0, dacă x; nu este extremitate a lui Uj.
Dacă graiul G = (X, F) este orientat, cu mulţimea vârfurilor dată prin X={ xi, X2..., xn} şi
mulţimea arcelor U={ ui, U2..., um}, atunci matricea de incidenţă S=(sij)i=I^, are
j=l,m
elementele Sjj date prin
1,dacă arcul Uj este incident spre exterior vârfului Xj,
Sjj = < -1, dacă arcul Uj este incident spre int erior vârfului ,
0, dacă arcul u j nu este incident vârfului xs

Exemplul 1.7.1. Se consideră grafurile din Figurile 1.7.1.a şi 1.7.1.b. Vrem să scriem
matricele de incidenţă.

Figura 1.7.1.a Figura 1.7.1.b

Primul graf este neorientat, aşa încât elementele matricei de incidenţă Si sunt numai 0 şi
1. Astfel avem:
U
1 u
2 u
3 u
4 u
5 u
6 u
7
X
1 ri 0 1 1 0 0 °1
X
2 i 1 0 0 0 0 0
X
3 0 1 1 0 1 0 1
X
4 0 0 0 1 1 1 0
X
5 ,0 0 0 0 0 1

-86-
Al doilea graf este orientat, deci elementele matricei de incidenţă S2 sunt 1, -1 şi 0.
Astfel avem:
U
1 u2 u
3 u 4 u 5 u6 u 7

f
X
1 0 1 - 1 0 0 0 ^

X2 - 11 1 0 0 0 0 0

X
3 0 - 1 - 1 0 - 1 0 1

X
4 0 0 0 1 1 - 1 0

X
5 , 0 0 0 0 0 1 -1 ,

Observaţia 1.7.1. Pe fiecare coloană apar exact două elemente nenule, firesc întrucât
fiecare muchie, sau arc, are exact două extremităţi. în cazul neorientat, pe fiecare linie, numărul
elementelor nenule indică numărul muchiilor incidente vârfului respectiv. în cazul orientat, pe
fiecare coloană există un element 1 şi un element -1, iar pe linie numărul elementelor de 1 indică
numărul arcelor incidente spre exterior vârfului respectiv, iar numărul elementelor de -1 indică
numărul arcelor incidente spre interior vârfului respectiv.
Fie un graf orientat sau neorientat cu mulţimea vârfurilor dată prin X={ X|, X2..xn}.
Construim matricea de adiacentă, de ordinul n, B= (b^)^, unde elementul by este dat prin

fi, dacă există arcul (muchia) (x^xA bii =


{
10, dacă nu există arcul (muchia) (x^xj).
Observaţia 1.7.2. Matricea de adiacenţă B este o matrice booleană, adică cu elemente
0 şi 1.
Exemplul 1.7.2. Se consideră grafele din Figurile 1.7.2.a şi 1.7.2.b. Vrem să scriem
matricele de adiacenţă.
X2 X2

Figura

1.7.2.a. Figura 1.7.2.b.

-87 -
Primul graf este neorientat şi are matricea de adiacenţă Bi dată prin

-88-
X
I x2 x
3 x
4 x
X
1 ^0 1 1 1 0
X
2 1 0 1 0 0
B, = X3 1 1 0 1 1
X
4 1 0 1 0 1
X
5 ^0 0 1 1 0

Al doilea graf este orientat şi are matricea de adiacenţă B 2

1
X x
2 x
3 x
4 x

f
i f°
x
1 0 0 1
X
2 0 0 1 1 0
B2 = X3 0 0 0 0 0
X
4 1 0 1 0 1
X
5 ,0 0 0 0 0

Observaţia 1.7.3. Pe lângă aceste două categorii de matrice ataşate grafelor, se vor mai
considera şi alte variante de reprezentări, prin care se evidenţiază şi lungimea arcului respectiv.
Observaţia 1.7.4. Grafurile orientate pot fi reprezentate cu ajutorul mulţimii tripletelor (I,
VI(I), VF(I)) în aşa-zisa reprezentare simbolică. Aici I este codul (simbolul) arcului, VI(I) este
(simbolul) vârfului iniţial al arcului I, iar VF(I) este codul (simbolul) vârfului final al arcului I.
Spre exemplu, graful din Figura 1.7.2.b, care are matricea de incidenţă S2, în reprezentarea
simbolică, va fi dat în tabelul

I 1 2 3 4 5 6 7
VI(D 1 2 1 4 4 5 3
VF(1) 2 3 3 1 3 4 5

Se observă că arcul Uj a fost codificat prin i, iar vârful xj a fost notat prin i.
Observaţia 1.7.5. Arborescenţele pot fi reprezentate şi numeric. Fiecare arc al
arborescenţei se consideră împărţit (secţionat) în două semiarce:
Semiarcul stâng, care se codifică printr-un număr natural nenul (corespunde
înaintării)
Semiarcul drept, codificat cu 0 (corespunde revenirii, întoarcerii).
Spre exemplu, arborescenţa din Figura 1.6.2. are reprezentarea
1,2, 0, 3, 4, 0, 0, 5, 6, 0, 0, 7, 0, 0,
care poate fi scrisă fară virgule astfel: 12034005600700.

-89-
II - Algoritmi pentru determinarea drumurilor optime într-un graf

2.1. Algoritmul lui Ford simplificat

Algoritmul lui Ford simplificat se aplică doar în graiuri care nu admit circuite. Cu ajutorul lui se
găseşte drumul de valoare optimă între două noduri fixate Xi şi Xj. Printr-o eventuală
renumerotare a nodurilor putem presupune că nodul de la care porneşte drumul este xj, care va fi
numit nod iniţial, iar nodul la care se termină este xn, numit nod final. [vezi(4)J Algoritmul este:

Pasul 1. I se dă vârfului iniţial valoarea 0 (zero): w(xo) = 0


Pasul 2. Se construieşte mulţimea A formată din nodul iniţial: A = {xi}
Pasul 3, Se analizează nodurile din afara mulţimii A.
— Dacă există noduri în care se poate ajunge prin arce directe doar de la nodurile
mulţimii A, acestea se adaugă la mulţimea A, cu valoarea:
w(xj) = min (w(xj)+v(xj,xi)), în problemele de minim
3( xj, xi )

sau w(xi) = max (w(x , )+v(x j5xi)), în problemele de maxim


Xj

af xj . xj ) apoi
se trece la pasul 4
— Dacă nu există nici un nod de acest tip atunci nu există nici un drum de la X \
laxn.
Pasul 4, Se analizează mulţimea A:
- Dacă xn e A atunci valoarea sa reprezintă valoarea drumului de valoare optimă
de la xi la xn. Pentru găsirea acestui drum se porneşte înapoi de la nodul final

xn şi se găsesc nodurile Xki ,Xk2, Xkr care formează drumul căutat, unde
X X
k
i = xn, kr = xi şi fiecare alt indice kj+i este cel pentru care:

w(Xki+i) + v(Xki+i, Xki) = w(Xki)


- Dacă xn g A se reia algoritmul de la pasul 3.
Exemplu 2.1.1. Pentru acelaşi graf şi aceeaşi pereche de noduri din exemplul rezolvat cu
algoritmul Iui Bellman-Kalaba vom avea succesiv: pasl: w(xi) = 0 pas2: A={xi}
pas3: Nodurile în care se poate ajunge doar din X\\ {x5} ^0 w{x5) = min( w(xi) + v(xi,xs)) = 0 +
5 = 5 pas4: xşi A
pas3: A = {xi,x5} şi nodurile în care se poate ajunge prin arce directe doar din xi şi X5 sunt:
{x6}*0
w{x6) = min( w(xi) + v(xi,x6), w(x5) + v(x5,x6)) = min(0 + 3 , 5 + 3) = 3 pas4: X9 g A

-90-
pas3: A = {xi,x5,x6} şi nodurile în care se poate ajunge prin arce directe doar din xi, X5 şi x^
sunt: {x2,x7} ^ 0
w{x2) = min( w(xi) + v(xi,x2), w(x5) + v(x5,x2), w(x6) + v(x6,x2)) = min(0 + 4,5 + 8,3 + 8)
=4
w{x7) = min( w(x5) + v(x5,x7), w(x6) + v(x6,x7)) = min(5 + 2,3 + 5) = 7 pas4: X9 £ A
pas3: A = {xi,x2>x5,x6,x7} şi nodurile în care se poate ajunge prin arce directe doar din xi, x 2,
X5, X5 şi x7 sunt: {x3,x8} ^ 0
w{x3) = min( w(x2) + v(x2,x3), w(x5) + v(x5,x3)) - min(4 + 7,5 + 2) = 7 w{xg) = min( w(x5)
+ v(x5,xg), w(x7) + v(x7,x8)) = min(5 + 9,7 + 6) = 13 pas4: X9 ţ£ A
pas3: A = {xi,x2,x3,xs,x6,x7,x8} şi nodurile în care se poate ajunge prin arce directe doar din xi,
x2,x3,x5, x6, x7 şi x8 sunt: {X4} * 0
w{X4) = min( w(x2) + V(X2,X4), w(x3) + v(x3,x4),w(x5) + V(X5,X4), w(x8) + v(X8,X4)) = min(4 +
9,7 + 3,5 + 7,13 + 4) = 10 pas4: X9 £ A
pas3: A = {xi,x2,x3,x4,x5,x6,x7,x8} şi nodurile în care se poate ajunge prin arce directe doar din
Xi, x2, x3, X4, x5, x6, x7 şi Xg sunt: {x9} ^ 0
w{x9) = min( w(x3) + v(x3,x9), w(x4) + v(x4,x9), w(x7) + v(x7,x9), w(x8) + v(x8,x9)) = min(7
+ 9, 10 + 3, 7 + 8,13 + 7) = 13 pas4: X9 E Aşi urmează să găsim drumul care are lungimea 13.
Avem succesiv:
W(X9) = W(X4 > + V(X4,X9)

-91-
W(X4 ) = W(X3) + V(X ,X4 )
3

w(x3) = w(x5) + v(x5,x3) w(x5) = w(xi) + v(xi,x5)


deci drumul căutat este: xj —> X5 x3 —> X4 —>
X9
Observaţia 2.1.1. [vezi (4)] Dacă graful are un circuit atunci se poate demonstra uşor că
nu vom putea da valoare nici unui nod al acestuia şi dacă există vreun drum de la xj Ia x n care
trece prin unul din nodurile circuitului nu vom putea da valoare nici lui x n, cu toate că există
drum de la xi la xn.
Observaţia 2.1.2. Algoritmul necesită pentru memorare şi manipulare doar cunoaşterea,
pentru fiecare nod, a nodurilor spre care "pleacă" arce din acesta şi valorile acestor arce, fiind
mult mai uşor de aplicat sau implementat pe calculator. El are însă dezavantajul că se poate
aplica doar în graiuri fară circuite.

2.2. Algoritmul Ford generalizat

Algoritmul lui Ford generalizat a fost creat cu scopul de a putea găsi drumul optim şi în
grafurile care au circuite. Cu ajutorul lui se găseşte drumul de valoare optimă între două noduri
fixate Xi şi Xj. Printr-o eventuală renumerotare a nodurilor putem presupune că nodul de la care
porneşte drumul este xi, care va fi numit nod iniţial, iar nodul la care se termină este x n, numit
nod final. [vezi(4)l Algoritmul este:
Pasul î. I se dă vârfului iniţial valoarea 0 (zero): w(xo) = 0 şi tuturor celelalte valoarea +00 (într-
o problemă de minim) sau (într-o problemă de maxim).
Pasul 2. în ordinea crescătoare a indicilor nodurilor se calculează pentru fiecare nod, pe bază
fostelor valori, noile valori cu formula:
f\

w (x¡) = min w(xj), min (w(xj)+v(xj,xi)) 1 în problemele de minim


Xj
3(xj,xi)

w(x¡), max (w(xj)+v(xj,xj))


sau w (x¡) = max în problemele de maxim
aixj.x;)

Pasul 3. Se compară noile valori w (xj) cu fostele valori w(x{):


- Dacă w*(x{) = w(xj) pentru orice nod x\ atunci:
- dacă w(xn) < 00 (la problema de minim) sau w(xn) > (la problema de maxim),
valoarea nodului xn reprezintă valoarea drumului de valoare

-92-
minimă(maximă) de la xi la xn. PentTU găsirea acestui drum se porneşte

înapoi de la nodul final xn şi se găsesc nodurile Xki ,Xk2, XK care

formează drumul căutat, unde Xk


i = xn, Xk
r = xi şi fiecare alt indice kj +I este
cel pentru care:

w(x ki+i) + v(x ki+i,x ki) = w(x ki) STOP


- dacă w(xn) = (-00) atunci nu există nici un drum de la xi la xn. STOP
- Dacă există cel puţin un nod pentru care w (xi) < w(x;) se reia algoritmul de la
pasul 2 pentru noile valori ale vârfurilor.
Observaţie 2.2.1. Algoritmul poate găsi drumul şi în grafuri cu circuite dar este evident
mult mai lent decât cel simplificat. Pentru scurtarea duratei de execuţie se poate modifica
algoritmul în sensul că o valoare nou calculată a unui vârf va fi folosită imediat ca atare la
calculul noilor valori ale celorlalte, nu doar după ce se calculează noile valori ale tuturor
vârfurilor.

III - Determinarea drumurilor hamiltoniene

Una dintre cele mai cunoscute probleme economice este problema comis voiajorului.
Comis voiajorul este un individ care trebuie să prezinte s-au să distribuie marfa comandată la o
serie de centre distribuite în general neliniar pe o anumită zonă teritorială (localităţile dintr- un
judeţ, magazinele dintr-un cartier, persoanele dintr-un sat etc). Dacă numărul de obiective care
trebuie vizitate este mare sau foarte mare iar timpul disponibil foarte limitat atunci devine vitală
o asemenea organizare a trecerii pe la fiecare obiectiv încât să se efectueze în timpul minim
posibil. Acest timp minim se traduce prin drumul cel mai scurt, iar cel mai scurt drum este
evident cel în care se trece pe la fiecare obiectiv o singură dată. în plus, la sfârşit trebuie să se
afle în punctul iniţial, adică sediul firmei la care lucrează.
O reprezentare a regiunii aprovizionate, în care centrele pe la care se trece sunt
vizualizate prin puncte iar căile de acces la acestea prin segmente de curbe, va fi evident un graf,
problema reducându-se la a găsi circuitul hamiltonian de lungime minimă.
în timp, s-au evidenţiat o multitudine de probleme reductibile la găsirea unui drum (sau
circuit) hamiltonian într-un graf, cum ar fi:
1. Problema poştaşului (găsirea traseului cel mai scurt care trece pe la toate locuinţele
ce aparţin de oficiul poştal la care lucrează acesta);
2. Problema adunării deşeurilor (cel mai scurt drum care trece pe la toate punctele de
depozitate a deşeurilor);
3. Problema succesiunii operaţiilor (executarea mai multor operaţii pe o maşină în acea
ordine în care suma timpilor consumaţi cu pregătirea maşinii pentru trecerea de la o
operaţie la următoarea să fie minim)
4. Ordinea lipirii unor componente electronice pe o placă, etc;
Problema determinării drumului (circuitului) hamiltonian de valoare optimă s-a dovedit
deosebit de dificilă, neexistând nici acum un algoritm care să rezolve problema în timp
polinomial şi nici măcar o metodă simplă prin care să se decidă dacă într-un graf dat există sau
nu drumuri hamiltoniene.
Există însă mai mulţi algoritmi, unii exacţi alţii heuristici, care reuşesc, într-un caz sau
altul, să rezolve problema satisfăcător şi în timp util.

3.1. Algoritmul lui Chen pentru determinarea drumurilor hamiltoniene în grafuri cu


circuite
Acest algoritm are următorii paşi: [vezi(10)]
Pasul 1. Se determină componentele tare conexe ale grafului (X, T), notate cu Ci, C2, . . .
Pasul 2. Se determină graful condensat asociat (X, T), care este un graf fără circuite.
Pasul 3. Se determină drumul hamiltonian în graful condensat, când există.
Pasul 4. Se aranjează componentele tare conexe în ordinea dată de drumul hamiltonian
determinat la Pasul 3.
Pasul 5. Se scriu toate drumurile hamiltoniene din fiecare componentă tare conexă.
Pasul 6. Stabilim legăturile de la o componentă la alta în funcţie de arcele de incidenţă
(legătură) din graful dat, citind apoi toate drumurile hamiltoniene.
Observaţia 3.1.1. Dacă în graful condensat nu există drum hamiltonian sau între două
componente nu există legătură, atunci graful nu are drumuri hamiltoniene.
Exemplul 3.1.1. Să aflăm drumurile hamiltonianiene ale grafului din Figura 3.1.1.

-94-
F
igura 3.1.1. Scriem matricea booleană
ataşată grafului

Xi X2 X3 X4 X5 X* X7 Xs

X! 0 1 1 0 0 0 0 0
X2 0 0 0 0 0 0 0 0
X3 0 1 0 1 0 0 0 1
0 1 0 0 1 0 0 0
&
W
II

X5 0 1 0 0 0 1 0 0
Xô 0 1 0 0 1 0 0 0
X7 0 0 0 1 0 1 0 1
X8 1 0 0 1 0 0 1 0

Determinăm toate legăturile prin drumuri ce pleacă din xi spre alte vârfuri

• Xi x2 X 3 X4 X 5 Xfi X7 Xg

Xi 1 1 1 1*

Unde Vi={xi, x2, x3, X4, x5, x6, x7} x8}


1
Procedăm Ia fel pe coloana întâi, scriind tabelul, pentru economie de spaţiu tot pe
i
orizontală
Xi 1** 1* 1* 1

Xi X2 X3 X4 x5 x6 X7 X8
De aici V2={xi, x3, x7, x8}.
Acum găsim prima componentă tare conexă Ci=(VinV2)U {xi }= {x\, X3, X7, xsj Eliminăm în
matricea B liniile şi coloanele corespunzătoare vârfurilor din Ci şi obţinem matricea:
X2 X4 X5 Xfi

X2 0 0 0 0

X4 1 0 1 0

X5 1 0 0 1

X6 1 0 1 0

Cum pe linia lui x2 în Bi avem numai cifra 0, deducem că următoarea componentă tare conexă este
C2= {x2}
Eliminând linia şi coloana corespunzătoare vârfului x 2 din B| obţinem:

X4 X5 X*

X4 0 1 0

X5 0 0 1

X6 0 1 0

Imediat rezultă şi componenta tare conexă C$= {X4}, rămânând matricea:

X5 X6

X5 0 1

X6 1 0

Xs X6

Xs 1* 1* Vi={x5, x6}. pentru care


avem

X5 1* 1

X5 X6 V2={x5, x6 }.

-96-
Deci, mai avem componente tare conexă C4={x5, X6},
Observaţia 3.2.1. [vezi(10)] Deoarece oricare două vârfuri dintr-o componentă tare conexă sunt legate
între ele prin drumuri, rezultă că un graf poate fi reprezentat prin unul care are ca vârfuri componentele tare
conexe, arcele de legătură, între ele stabilindu-se după arcele din graful dat. în cazul exemplului nostru
obţinem graful din Figura 3.2.1.Graful astfel obţinut se numeşte graful condensat ataşat grafului dat.

Figura 3.2.1.
Se observă că în graful condensat avem drumul hamiltonian
dcH={Ci, C3î C4, C2}
Acum, scriem componentele tare conexe în ordinea din drumul dcH şi sub ele scriem toate drumurile
hamiltoniene din fiecare componentă:

Q c3 c4 c2
X1X3X8X7 X5X6

X4 X2

X7X8X]X3 X6X7

Apoi stabilim legăturile între elemente din drumurile dintr-o componentă şi primele vârfuri din
componenta următoare (le indicăm prin săgeţi).
Obţinem drumurile hamiltoniene:
dm={xi, x3, x8, x7, X4, x5, x6, x2} d2H={ x7, x8, xi, x3j X4, x5, x6,

x2 }
3.2. Algoritmul lui Kaufmann [vezi (6)]

Pasul 1. Construim matricea latină L asociată grafului, unde:


Í x j x j dacă exista arcul (x¡, Xj)

-97-
[O dacă nu exista arcul (xj, x-)

Pasul 2. Construim matricea L, definită prin:


ixj dacă exista arcul (xi5 Xj)
^ jo dacă nu exista arcul (xj5 Xj)

numită matricea latină redusă.


Pasul 3. Se calculează succesiv matricile:

L2 = LXL L, L3 = L2XL L,..., Lk+1 = LkxL L,... folosind operaţiile de înmulţire şi adunare
latină, alfabetul fiind mulţimea nodurilor grafului, unde operaţia de înmulţire este uşor modificată, produsul
dintre două elemente ale matricilor fiind 0, dacă unul dintre ele este 0 sau au un nod comun, şi este produsul
latin al lor, în caz contrar.
Din felul cum a fost construită, matricea L k va conţine toate drumurile elementare de lungime k. Cum
un drum elementar poate avea cel mult n noduri (câte are graful cu totul) rezultă că:
- primele n-l puteri ale L conţin toate drumurile elementare din graf;
- puterile lui L mai mari sau egale cu n au toate elementele egale cu 0;
- matricea Ln_1 conţine toate drumurile hamiltoniene din graf.
Pasul 4. Dacă se doresc şi circuitele atunci se verifică pentru fiecare drum hamiltonian dacă poate fi completat
până Ia un circuit (adică dacă există în graf arcul care uneşte nodul final cu cel iniţial);
Pasul 5. Dacă se doreşte şi drumul (sau circuitul) de valoare optimă (maximă sau minimă) se calculează suma
valorilor pentru fiecare drum şi/sau circuit şi se alege cel cu valoarea optimă.

în concluzie, metoda înmulţirii latine (A. Kaufmann - J. Melgrange) determină toate drumurile
elementare din graf, prin calcularea matricelor M (1), M(2), ..., în matricea se citesc drumurile hamiltoniene.
Această metodă a înmulţirii latine (algoritmul Iui Kaufmann) este utilă, mai ales, în cazul graiurilor
tare conexe, unde algoritmul lui Foulkes nu este eficient. Totuşi, metoda este greu de aplicat în grafuri cu un
număr mare de noduri. în acest caz este preferabil să se construiască graful condensat, să se determine
drumurile hamiltoniene în fiecare în parte cu algoritmul lui Kaufmann şi apoi, ca la algoritmul lui Foulkes, să
se caute drumurile hamiltoniene în graful iniţial.

3.3. Un algoritm bazat pe algoritmul ungar [vezi (6)]

Fie G = (X,U) un graf orientat cu n noduri X = {xi, x2, ..., xn}.

Pasul 1. Se construieşte graful bipartit H = (AuB,V) în care A = B = XşiV = U (adică am folosit pentru G
reprezentarea prin corespondenţă).
Pasul 2. Se găseşte pentru graful H cuplajul maxim de valoare minimă.

-98-
Pasul 3. Se construieşte graful parţial al lui G format doar cu arcele cuplajului găsit. Este uşor de demonstrat
că, componentele tare conexe ale acestuia sunt toate nişte circuite. Dacă s-a format un singur circuit
acesta este circuitul hamiltonian de valoare minimă. Dacă s-au format mai multe se trece la pasul 4.
Pasul 4. Pentru fiecare arc aflat pe circuitul de lungime minimă (dacă sunt mai multe se iau în considerare
arcele tuturor) se reia algoritmul de la pasul 1 pentru graful parţial rezultat din G prin eliminarea
acestui arc.
Pasul 5. Pentru fiecare graf parţial se continuă procedeul până se ajunge la unul din cazurile:

Cazul 1. Cuplajului maxim găsit îi corespunde un singur circuit. Dacă acest circuit este primul
obţinut atunci valoarea sa i se atribuie unei variabile Z şi circuitul este păstrat. Dacă
nu este primul atunci valoarea sa se compară cu Z şi, dacă este mai mică, ea devine
noua valoare a lui Z şi circuitul se păstrează, eliminându-1 pe cel corespunzător fostei
valori a lui Z. în caz contrar se trece la alt graf parţial neanalizat încă.
Cazul2. Cuplajul maxim are o valoare mai mare decât Z. Pentru acest graf parţial se
abandonează ramificarea.

Pasul 6. Se continuă analiza graiurilor parţiale până sunt analizate toate ramificaţiile. Valoarea Z finală este
valoarea circuitului de valoare minimă iar circuitul corespunzător este cel optim.
Analiza de mai sus poate fi schematizată printr-un arbore de tipul: în care fiecare nod este un graf
parţial de analizat, iar pentru fiecare arc, nodul inferior este un graf parţial care provine din graful
corespunzător nodului superior, prin suprimarea unui arc de pe circuitele de lungime minimă corespunzătoare
cuplajului maxim de valoare minimă al acestuia.

Observaţie 3.3.1. [vezi (6) ] Algoritmul asigură găsirea circuitului de valoare minimă iar în cazul în
care algoritmul lui Foulkes nu funcţionează este o alternativă mai bună decât algoritmul lui Kaufmann. Totuşi
el nu lucrează în timp polinomial şi în unele cazuri (de exemplu cazuri în care se formează foarte multe cicluri
cu lungime minimă) necesită un număr imens de calcule.
în aceste cazuri se pot folosi metode euristice prin care se elimină din start o serie de arce, considerate
a avea valori prea mari pentru a se putea afla pe circuitul hamiltonian de valoare minimă, apoi se aplică în
graful parţial rămas unul din algoritmii de mai sus.

-99-
IV - Algoritmi pentru determinarea arborilor de lungime optimă intr-un graf

4.1. Algoritmul lui Prim

Algoritmul lui Prim determină arborele de acoperire de lungime minimă într-un graf
conex ponderat G=(X, U, 1) şi, spre deosebire de algoritmul lui Kruskal, nu cere ca ponderile
a două muchii diferite să fie diferite. Se notează nodurile lui G cu numere de la 1 la n [vezi
(2)]. Sunt folosiţi trei vectori de dimensiune n astfel:
X=( %u Xn), cu componentele
_ [ 1 dacă nodul iniţial este în arbore [0 altfel,
p=(pi, p2,..., pn), cu componentele
fj dacă muchia [i, j] este în arbore
Pi H
[0 pentru nodul iniţial, c=(ci> C2V.., cn), cu
componentele
fl([i,p| ]) ponderea muchiei [i, j]
Ci =<
[0 pentru nodul iniţial,

Pentru i=l,n.
Pasul 1. Se iniţiază cu 0 cei trei vectori. Se dă nodul de start s (1< s< n) şi %s=l; A={ s } arborele parţial.
Pasul 2. Determină muchia [ij], cu ponderea minimă, care are o extremitate în arborele parţial, iG A şi
cealaltă je X - A. Atunci % =1, pj=i şi Cj=l([ij]) până când Xj =1
(V> = Ln .
Pasul 3. Arborele de acoperire de lungime minimă este dat de muchiile [pi, i], iar lungimea
n
minimă este Lmin-^Ci.
¡=1
Algoritmul furnizează arborele de acoperire de lungime minimă prin înlocuirea muchiilor unui
arbore oarecare ţinut cu vârfurile grafului G cu muchiile arborelui de lungime minimă.
Exemplu 4.1.1. Fie G=(X, U, 1) un graf conex ponderat neorientat, ca în Figura 4.1.1., X = 5 şi
U=7. Pe arce sunt trecute ponderile. Să se construiască un arbore de acoperire de lungime (pondere)
minimă, folosind algoritmul lui Prim.

-100
-
x
i

Figura 4.1.1.
Pasul 1. s=l:A={l}

nodul 1 2 3 4 5

X 1 0 0 0 0
P 0 0 0 0 0
c 0 0 0 0 0

Pasul 2. min {1([1,2])51([1,3]), I([l,4])}= 1([1,3])=15

nodul 1 2 3 4 5

X 1 0 1 0 0
P 0 0 1 0 0
c 0 0 15 0 0

min {1([1,2]), 1([1,4]), 1([3,2]), 1([3,4]), 1([3,5])}= 1([3,4])=10

nodul 1 2 3 4 5

X 1 0 1 1 0
P 0 0 1 3 0
c 0 0 15 10 0

min {!([!,2]), 1([3,2]), 1([3,5])}= 1([1,2])=16

nodul 1 2 3 4 5

X 1 1 1 1 0

-101
-
P 0 1 1 3 0
c 0 16 15 10 0

min {1([2,5]), 1([3,5])}= 1([2,5])=14

nodul 1 2 3 4 5

X 1 1 1 1 1
P 0 1 1 3 2
c 0 16 15 10 14

Xj = 1, i = 1,4 şi trece la pasul următor.


Pasul 3. Arborele de acoperire de lungime minimă este {[1,2]; [2,5]; [1,3]; [3,4]} şi are lungimea L mjn=55.
Determinarea arborelui de acoperire de cost minim prin algoritmul lui Prim.

Algoritmul constă în următoarele:


a) Iniţial se ia arborele ce conţine un singur vârf. S-a demonstrat că nu are importanţă cu care
vârf se începe; ca urmare se ia vârful 1. Mulţimea arcelor este vidă.
b) Se alege arcul de cost minim, care are un vârf în arborele deja construit, iar celălalt vârf nu
aparţine arborelui. Se repetă în total acest pas de n-l ori.
Pentru evitarea parcurgerii tuturor arcelor grafului la fiecare pas, se ia vectorul v
având n componente definit astfel:
fO dacă vârful i aparţine arborelui deja construit U[i] = <
(k dacă vârful i nu aparţine arborelui deja construit; k este vârful arborelui deja construit a. î. muchia (i, k) este
de cost minim.
Iniţial v[l]=0 şi v[2]=v[3]=...=v[n]=l, adică iniţial arborele este A =({1}, 0).

Implementarea algoritmului lui Prim în limbajul de programare C++ este: date de intrare:
Se citesc:
- numărul de noduri
- triplete de forma x y t cu semnificaţia că între x si y există un drum de cost t date de ieşire:
Pe monitor se afişează costul arborelui şi muchiile arborelui de cost minim.

/*Algoritmul lui Prim */


#include <stdio.h>

-102
-
#include <conio.h>
#define nmax 10 #define MAX 0x7fff void prim(int n,int c [nmax] [nmax], int muchii[nmax][2],int *cost)
/* n -numărul nodurilor; c - matricea costurilor;
muchii-muchiile arborelui de acoperire de cost minim; cost-costul arborelui de
acoperire de cost minim */
{
int v[nmax]; /* v[i]=0 dacă i aparţine arborelui;
v[i]=j dacă i nu aparţine arborelui, j este nodul din arbore a.i.
muchia (i j) este de cost minim */
int ij,k,minim;
*cost=0;
v[l]=0;

for(i=2;i<=n;i++) v[i]=l; /*arborele este ({1},{}) */


/* determinarea celor n-l muchii */ for(i= 1; i<=n-1; i++)
{
/* determinarea muchiei care se adaugă arborelui */ minim=0x7fff;
for(k=l ;k<=n;k-H-) if(v[k]!=0) if(c[k][v[k]] < minim)
{
j=k;
minim=c[k][v[k]];
}
muchii[i][0]=v[j];
muchii[i][l]=j;
*cost=*cost+c[j][v[j]];
/*reactualizare vector v */ v|j]=0;
for(k=l ;k<=n;k++) if(v[k]!=0) if(c[k]
[v[k]]>c[k]D])v[k]=j;
}
}
void main()
{
int n;/*nr. nodurilor */ int c[nmax][nmax]; /*matricea
costurilor */ int muchii[nmax][2];/*muchiile arborelui*/
int i j ,cost;
printf(',\nNr. noduriIor=");
scanf("%d",&n); for(i=l ;i<=n;i++)
for(j=1J <=ny++) c[i][j]=MAX;
/*citirea costurilor(numere întregi) */ for(i=l;i<n;i-H-)

-103
-
{
do
{
printf("\nIntroduceţi 0 pentru terminare sau nodul adiacent\n");
printf(" cu %2d > ca el =",i);
scanf( %d",&j);
,,

ifO>0)
{
printf("\nCostul c[%d][%d]=",ij); scanf(f,
%d",&c[i][j]);
c
[j][i]~c[i]D] j /*matricea este simetrica */
}
}
while(j>0);
};
prim(n,c,muchii,&cost); prmtf("\nCOSTUL ARBORELUI = %d",cost);
printf("\nMUCHIILE ARBORELUI COSTUL MUCHIEI\n"); for(i=l ;i<=n-
l;i++)
printf(" %2d - %2d % 1 Od\n'',muchii [i] [0] ,muchii[i j [ 1 ], c[muchii[i][0]]
[muchii[i][l]]);
getch();
}

4. 2. O variantă a algoritmului lui Kruskal [vezi (2)]

Pasul 1. Dintre toate muchiile grafului se alege cea de valoare minimă (maximă);
Pasul 2. Dintre toate muchiile adiacente componentei conexe formată din arcele alese până în acest moment,
se alege cea de valoare minimă (maximă);
Pasul 3. Se reia pasul 2 până se colecţionează n-l muchii.

Algoritmul are toate avantajele algoritmului lui Solim şi, în plus, lucrează cu o singură componentă
conexă, fiind mult mai uşor de implementat pe calculator şi mult mai rapid în execuţie.

Exemplu 4.2.1. Administraţia unei localităţi montane a hotărât construirea unor linii de teleferic care
să lege oraşul de cele 8 puncte turistice importante din jurul acestuia. în urma unui studiu au fost puse în
evidenţa toate posibilităţile şi costurile de conectare a obiectivele turistice între ele şi cu oraşul, acestea fiind

-104
-
prezentate în figura 4.2.1.
Se cere găsirea variantei de construcţie de cost minim, care să asigure accesul din oraş la oricare din
obiectivele turistice.
Rezolvare
Condiţia de cost minim implică două obiective:

1. Să se construiască minimul de arce necesare;


2. Să se construiască cele mai ieftine legături.
Referitor la numărul de arce necesar, facem observaţia că, dacă din oraş se va putea ajunge la orice

obiectiv turistic, atunci se va putea ajunge şi de la orice staţiune la oricare alta (trecând prin oraş), deci trebuie ca

arcele alese pentru construcţie să formeze la un loc un graf conex.

In concluzie, căutăm un graf parţial conex cu un număr minim de arce, adică un arbore. în plus, suma

costurilor arcelor sale trebuie să fie minimă. Vom aplica pe rând cei trei algoritmi pentru găsirea acestuia:

A. Kruskal

La primul pas poate fi ales unul din arcele OP3 sau OP7, ele având valoarea minimă 2. Putem alege

oricum primul arc dintre cele două pentru că la al doilea pas va fi ales celălalt.

La pasul trei poate fi ales unul din arcele OP5, OP6 sau P)P6 care au valoarea minimă

3. Nici în acest caz nu are vre-o importanţă ordinea alegerii, deoarece pot fi alese succesiv toate trei fară a se
forma nici un ciclu.

Al şaselea arc poate fi ales dintre arcele P4P5 şi P1P2, care au valoarea minimă 4. Nici în acest caz nu are

vre-o importanţă ordinea alegerii, deoarece pot fi alese succesiv ambele, fară a se forma nici un ciclu.

Următoarea valoare disponibilă a unui arc este 5, dar arcul opt nu poate fi ales dintre arcele OPi, P6P7,
deşi au valoarea minimă 5. Arcul OPi nu poate fi ales deoarece s-ar forma ciclul OPiPâ, iar P 6P7 ar duce la
ciclul OP6P7. Următoarea valoare minimă este 6, pentru arcul P5P7 dar nu poate fi ales deoarece se formează
ciclul OP5P7.
Valoarea următoare, 1, o au arcele OP4, P2P3 şi P5P8. OP4 nu poate fi ales deoarece s-ar forma ciclul
OP5P4. Arcul P2P3 nu poate fî ales deoarece s-ar forma ciclul OP6P1P2P3. Arcul P5P8 nu formează nici un
ciclu şi el va fi al optulea arc ales. în acest caz, deoarece s-au adunat 8 arce într-un graf cu 9 noduri, am obţinut
graful căutat.
Acest arbore este reprezentat în Figura 4.2.

-105
-
Figura 4.2.2.

B. Sollin

Vom alege: pentru nodul O — arcul OP3


»
pentru nodul Pj — arcul PiPâ
^
pentru nodul P2 — arcul PiP2
»
pentru nodul P3 — arcul OP3
>
pentru nodul P4 — arcul
* P4P5
pentru nodul P5 — arcul OP5
>
pentru nodul P6 — arcul PjPg
>
pentru nodul P7 — arcul OP7
>
pentru nodul Pg arcul
PsPg

Rezultă graful parţial:

După cum se vede, s-au format două componente conexe: Q = {P|, P2, Pe}

-106
-
C2 = {O, P3, P4, P5, P7, Ps} •
Vom alege: pentru Ci —» arcul OPg pentru C2 —> arcul OPe şi obţinem o singură
componentă conexă, care este arborele căutat.

C. Varianta algoritmului lui Kruskal

Succesiunea alegerii arcelor va fi:

1 —> OP3
2 —> OP7

3 —» OP6

4 OP5

5 —> P1P
6
6 —> P1P
2
7 —^ P4P
5
8 P5P
8
V - Aplicaţii ale graiurilor

5.1. Să se determine, cu algoritmii lui Kruskal respectiv Sollin, arborele parţial de lungime minimă în
graful din 5.2.
Soluţie: Cu algoritmul lui Kruskal, vom alege pe rând muchiile în ordinea crescătoare a lungimilor, de
fiecare dată muchia de lungime minimă, care nu formează ciclu cu muchiile deja alese. Astfel alegem muchia
X3X4, de lungime 3, apoi muchia X2X4, de lungime 4, apoi muchia X7X8, de lungime 5, apoi muchia X5X6,
de lungime 6, apoi X1X5, de lungime 7 şi apoi X1X2, de lungime 8, cum se vede în Figura 5. 3.

-107
-
Figura 5.2.

Figura 5.3.
Muchia X2X3, de lungime 9, care urmează, nu poate fi aleasă deoarece formează ciclul X2X3X4X2.

Alegem, de aceea, muchia X4X7, de lungime 10.


Am ajuns astfel la arborele parţial de lungime minimă, deoarece avem 7 = 8 — 1 muchii alese,
reprezentat în Figura 5.4., care are lungimea 3 + 4 + 5 + 6 + 7 + 8+ 10 = 43.
Cu algoritmul lui Sollin procedăm după cum urmează. în fiecare vârf se alege muchia de cea mai mică
lungime (se vede că toate muhiile au lungimi diferite).
Astfel, în xi se alege muchia xix 5, de lungime 7, în X2 muchia X2X4, de lungime 4, în X3 muchia
X3X4, de lungime 3, în X4 muchia X4X3, de lungime 3, în X5 muchia X5X6, de lungime 6, în X6 a fost deja aleasă
muchia X6X5, în X7 muchia X7X8, de lungime 5, iar în X8 a fost deja aleasă muchia X8X7.
Au fost alese, în această primă fază, doar 5 muchii, cum se vede în Figura 5. 4.

Figura 5.4.

S-au obţinut astfel 3 componente conexe care trebuie legate între ele prin două muchii. Acum se alege
(pornind din prima componentă ce conţine pe xj) muchia de lungime minimă,

-108
-
8, dintre X]X2, care leagă cele două componente conexe, iar din a treia componentă (ce conţine pe x 7) se alege
muchia de lungime minimă, 10, dintre X7X4. S-a obţinut astfel arborele parţial de lungime minimă, exact acelaşi
găsit şi algoritmul lui Kruskal, cu l
m n i = 43.

5.2. Un graf se numeşte bipartit dacă există o partiţie a mulţimii vârfurilor X=AuB. Astfel încât orice
muchie a grafului să aibă o extremitate în A şi alta în B. Să se arate că un graf G este bipartit dacă şi numai
dacă orice ciclu elementar al lui G are un număr par de vârfuri.
Soluţie: Pentru a demonstra necesitatea, fie G un graf bipartit care admite bipartiţia X~A u B. Orice ciclu
elementar din G are forma:
[ai, bi, a2, b2,..., ak, bk, ai]
Unde üj£ A şi b¡e B pentru 1< i< k.
Lungimea acestui ciclu este 2k, deci un număr par.
Să presupunem acum că orice ciclu elementar al lui G are un număr par de vârfuri.
Vom colora cu două culori vârfurile lui G astfel încât oricare două vârfuri unite printr- o muchie să
aibă culori diferite în modul următor:
Placăm de la vârful xi pe care îl colorăm cu culoarea a, vârfurile adiacente cu xi Ie colorăm cu
culoarea b, vârfurile adiacente cu vârfurile cu culoarea b le colorăm din nou cu a ş.a.m.d. în acest mod nici un
nod din componenta conexă care îl conţine pe xi nu va fi colorat odată cu a şi odată cu b, ceea ce este
contradictoriu.
într-adevăr, să presupunem că vârful z este colorat de-a lungul unui lanţ Li=[ xj, yi,..., yk, z] de
lungime pară cu culoarea a şi de-a lungul unui lanţ L2=[ xj, tj, ts, z] de lungime impară cu culoarea 1. Dacă Li
şi L2 nu au în comun decât extremităţile, reuniunea muchiilor lui L] şi L2 formează un ciclu elementar cu un
număr impar de muchii, ceea ce contrazice ipoteza. în caz contrar Li şi L2 au anumite vârfuri comune, ceea ce
determină ca reuniunea muchiilor lui Lj şi L2 să genereze un subgraf parţial al lui G format din lanţuri şi
cicluri. Vom demonstra prin inducţie după numărul de muchii ale lui Li că din condiţia ca G să nu conţină
cicluri elementare impare se deduce că lungimile lui Li şi L2 trebuie să aibă aceaşi paritate.
Dacă l(Li)=l şi 1(L2) este un număr par, rezultă că ciclul elementar format din muchia lui Li şi
muchiile lui L2 este impar, ceea ce contrazice ipoteza. Obţinem deci că 1(L2) este număr impar. Să
presupunem că proprietatea este adevărată pentru oricare două lanţuri Li şi L2 de forma indicată astfel încât
Lj< t şi fie Li şi L2 două lanţuri cu aceleaşi extremităţi astfel încât l(Li)= t+1.

Am presupus că Li şi L2 mai au un vârf y în comun, diferit de xj şi z. Să notăm cu Li şi L 2

sublanţurile lui Li, respectiv L2 cuprise între xi şi y şi cu h\, L"2 sublanţurile lui Li, respectiv L2 cuprinse între

y şi z. Deoarece 1( Lj )< t rezultă, conform ipotezei de inducţie, că l(Lj) şi 1(L2) au aceeaşi paritate. Luând în

rolul lui xi pe y, deoarece 1(L¡)< t rezultă de asemenea că l(Lj) şi 1(L"2) au aceeaşi paritate. Deoarece l(Li)=

-109
-
l(Lj) + 1( LY) şi 1(L2)= 1(L2)
+ 1(L2), rezultă că şi l(Li) şi 1(L2) au aceeaşi paritate. Deci vârfurile din componenta conexă care îl conţine pe
xj pot fi colorate în acest mod cu două culori. Continuând procedeul pentru toate componentele conexe ale lui
G obţinem o colorare cu două culori, a şi b a vârfurilor lui G astfel încât oricare două vârfuri adiacente să aibă
culori diferite. Rezultă că G este bipartit, luând în mulţimea A vârfurile colorate cu culoarea a şi în mulţimea
B vârfurile colorate cu culoarea b.
Mai rezultă că orice graf G fară cicluri impare, care are cel puţin o muchie, este bicromat sau %(G)=
2.

5.3. Se consideră o tablă de şah cu n linii şi m coloane (n impar). Poate un cal de pe tabla de şah,
sărind în L, să treacă o dată şi numai o dată prin toate cele n 2 pătrăţele ale tablei, întorcându-se în punctul de
plecare?
•y
Soluţie: Fie G graful cu n vârfuri care corespund pătratelor tablei de şah, două vârfuri fiind adiacente dacă
există o săritură în L a calului de pe un pătrat pe celălalt. Deoarece calul sare de pe un pătrat alb pe unul negru
şi de pe un pătrat negru pe unul alb, rezultă că acest graf este bipartit. Conform problemei 8., acest graf nu
conţine ciluri elementare cu un număr impar de vârfuri, deci nu există un ciclu elementar cu n 2 vârfuri.
Traseul calului pe tabla de şah cu proprietăţile cerute este deci imposibil.

5.4. Fiind date n oraşe, dorim să construim o reţea telefonică conexă cu vârfurile în aceste n oraşe. Se
cunosc costurile c(u) de construcţie ale liniei pentru orice muchie u=[xî, Xj] cu Xj ± Xj a grafului complet G
astfel definit şi dorim să minimizăm costul total de construcţie a reţelei. Deci trebuie să găsim un arbore
parţial A a lui G astfel încât suma costurilor asociate muchiilor lui A să fie minimă.
Să se arate că următorul algoritm produce un arbore parţial minim al lui G:
a. Se alege muchia lui G cu cost minim;
b. Dintre muhiile nealese, se selectează o muchi care nu formează cicluri cu muhiile
deja alese şi care are costul minim.
Se repetă aplicarea pasului b. al algoritmului până alegem o mulţime de muchii de
cardinal n-l.
Soluţie: Să arătăm că în urma aplicării algoritmului, cînd ajungem la o mulţime de n-l muchii care nu conţine
cicluri, am găsit un arbore cu n vârfuri.
Intr-adevăr, să presupunem prin reducere la absurd că graful obţinut nu este conex şi are p>2
componente conexe care conţin respectiv n), ..., n p vârfuri. Deoarece aceste componente conexe nu conţine
cicluri, fiecare este un arbore. Rezultă că numărul de muchii din fiecare componentă este egal respectiv cu
n r l , n p - l şi putem scrie:

-110
-
ni-l+...+ np-l = n-p = n-l de unde rezultă p = 1, deci graful
obţinut este conex şi fară cicluri, deci este arbore.
Să presupunem, prin reducere la absurd, că arborele parţial A obţinut în urma aplicării acestui algoritm
nu este minim, deci există un alt arbore Ai de cost c(Aj) < c(A), unde prin c(A) am notat suma costurilor
muchiilor lui A.

-111
-
Să presupunem că muchiile Iui A sunt ui, u 2, u n - i , indicele corespunzând ordinei de
obţinere a muhiei cu algoritmul indicat şi că prima muchie a arborelui A din acest şir, care nu
este muchie a lui Ai, este muchia u^ Să adăugăm muchia Uk la arborele Ai.
Acest ciclu conţine măcar o muchie Vj care nu aparţine arborelui A, deoarece în caz
contrar A ar conţine un ciclu, ceea ce este imposibil. Dacă suprimăm muchia Vj obţinem tot un
arbore A2, deoarece graful obţinut din Gj prin prin suprimarea muchiei v¡ nu conţine cicluri şi are
n-l muchii, deci este un arbore conform raţionamentului anterior.
Costul acestui arbore este egal cu:
c(A2) = c(Ai) + c(uk) - c(vi) însă din descrierea algoritmului
rezultă că Uk este muchia de cost minim care nu formează cicluri cu muchiile ui, u 2,..., Uk-i. însă
nici muchia v¡ nu formează cicluri cu aceste muchii, deoarece Ai este arbore. Rezultă c(uk) <
c(v¡), deci c(A2) < c(A]). Repetând acest procedeu vom înlocui toate muchiile arborelui Aj care
nu sunt muchii ale arborelui A prin muchii ale arborelui A, obţinând un şir de arbori: A 2, A3,...,
Ar = A, astfel încât costurile lor să verifice inegalităţile:
c(Ai) > c(A2) > *.. > c(Ar) = c(A),

deci c(Ai) > c(A). Am ajuns astfel la o contradicţie, deoarece am presupus că c(Ai) < c(A), deci
A este arbore minim al lui G şi algoritmul este justificat.

5.5. Dacă toate cele muchii ale grafului cu vârfurile reprezentând cele n oraşe din

problema precedentă au costuri diferite două câte două atunci


arborele parţial de cost minim este unic.
Soluţie: Să presupunem că ar exista doi arbori de cost minim, A şi Ai, deci putem găsi o muchie
u a lui A care nu este muchie a lui Ai. Să considerăm lanţul din Ai, care uneşte extremităţile
muchiei u. Există o muchie v a acestui lanţ care uneşte două vârfuri situate în cele două
componente ale grafului obţinut din A prin suprimarea muhiei u. Rezultă că graful A 2 obţinut din
A prin suprimarea muhiei u şi înserarea muchiei v, cât şi graful A3 obţinut din A] prin
suprimarea muhiei v şi înserarea muchiei u sunt arbori. Deoarece c(u) ^ c(v) obţinem că:
min(c(A2), c(A3)) < c(A) deoarece c(A2) = c(A) - c(u) + c(v) şi
c(A3) - c(A) - c(u) + c(v), ceea ce contrazice ipoteza că c(A) este minim.
Deci arborele minim este unic.

-112
-
5.6. La un turneu de şah participă n şahişti. Ştiind că fiecare şahist trebuie să susţină câte o
partidă cu fiecare din ceilalţi n-l şahişti şi nu poate susţine mai mult de o partidă pe zi, să se afle numărul
minim de zile în care se poate termina turneul.
Soluţie: Reprezentând şahiştii prin vârfurile grafului complet K n, partidele desfăşurate într-o zi se pot
reprezenta printr-o mulţime de muchii care nu au două cîte două extremităţi comune.
Rezultă că numărul minim de zile în care se poate termina turneul este egal cu numărul minim de
culori necesare pentru a colora muchiile lui K n, astfel încât oricare două muchii cu o aceeaşi extremitate să
aibă culori diferite.
într-adevăr, putem colora cu o aceeaşi culoare muchiile corespunzătoare partidelor care se
desfasoară în aceeaşi zi.
Deci numărul minim de zile este q(Kn), deci n zile pentru n impar şi n-l zile pentru n par.

5.7. Să se arate că dacă un graf cu n vârfuri nu conţine subgrafuri complete cu k vârfuri (k> 2)
atunci el conţine cel puţin m={n/(k-l)} vârfuri cu gradele mai mici sau egale cu p=[(k-
l)n/(k-l)].
Soluţie: Fie n=(k-l)q+r cu 0< r< k-2 şi (k-2)n=(k-l)p+s unde 0< s< k-2 şi r, s numere întregi.
De aici se decuc că dacă r=0 avem şi s=0, iar dacă r> 1 atunci s=k-r-l.
Să presupunem prin reducere la absurd că numărul vârfurilor x de grad d(x) < p este mai mic decât
m, celelalte vârfuri y având gradul d(y) > p+1. Deci presupunem că există o partiţie XuY a mulţimii
vârfurilor grafului astfel încât d(x) < p pentru orice vârf x eX, d(y) > p+1 pentru orice vârf y e Y şi în plus
|X[ <m; |Y| >n-m.

Fie un vârf yi € Y şi să notăm prin A(yi) mulţimea vârfurilor legate printr-o muchie cu yi. în
mulţimea A(yi)flY vom alege un alt vârf y2. A(yi)Pl A(y2) conţine cel puţin:
|A(y!) n A(y2 ] = |A(y,} +1A(y2 } - |A(y,) u A(y 2 ] > 2(p +1) ^- n
vârfuri.
Dacă am obţinut mulţimile de vârfuri A(yi), ..., A(yic_2) cu yjG p|A(yj )n Y pentru j= 1,
i<j

k-2
k-2, vom demonstra că mulţimea BflY este nevidă, unde am notat B = p|A(yj). Această
i=i

proprietate va justifica totodată posibilitatea alegerii vârfurilor y 2, ..., yk-i- într-adevăr, se obţine uşor prin

inducţie că |B| > (k-2)(p+l )-(k-3)n.


Vom considera două cazuri:
1) r=s=0. în acest caz (k-2)(p+l)-(k-3)n=(k-2)((k-2)q+l)-(k-3)(k-l)q=q+k-2> q.
2) r> 1. Obţinem:

-113
-
(k-2)(p+l )-(k-3)n=(k-1 )p-p+k-2-(k-1 )p-s+n=n-p+k-s-2= n + — — - p + k - s - 2=
k-1 k-1
r s r+ s
q+--------v p H-------p+k-s-2=q+--------+k-s-2> q+1, deoarece r+s=k-l si k-s-2> 0.
k-1 k-1 4 k-1
Deci în ambele cazuri B conţine cel puţin m={n/(k-l)} vârfuri.

Dacă am avea BflY=0, am obţine BcX, ceea ce nu este posibil, deoarece |x|<m şi |B| >m. Deci

există un vârf yk-ie BflY care are gradul d(yk-i) > p+1. Astfel obţinem:

Q A(yj j <(k-l)(p+l)-(k-2)n=k-l-s>0,

k-1
ceea ce implică existenţa unui vârf y = f] A(y;).
i=i

Din modul de construcţie, vârfurile yi, y2,..., yk formează un subgraf complet cu k vârfuri, ceea ce
contrazice ipoteza, deci există cel puţin m vârfuri de grad mai mic sau egal cu p.

5.8. Pentru o mulţime M formată din 1001 persoane, orice submulţime formată din 11 persoane
conţine cel puţin două persoane care se cunosc între ele.
Să se arate că există cel puţin 101 persoane astfel încât fiecare dintre ele cunoaşte cel puţin 100
persoane din M.
Soluţie: Să definim un graf G cu 1001 vârfuri: xi, X2, xiooi, în modul următor: legăm vârfurile x, şi xj
printr-o muchi dacă persoana i şi persoana j din mulţimea M nu se cunosc între ele.
Deoarece orice submulţime formată din 11 persoane conţine cel puţin două persoane care se
cunosc între ele, rezultă că G nu conţine subgrafuri complete cu 11 vârfuri.
Să aplicăm rezultatul din problema precedentă pentru n=1001 şi k=ll.
Obţinem ca G conţine cel puţin m=101 vârfuri cu gradele mai mici sau egale cu p=900,
deci în graful complementar G există cel puţin 101 vârfuri cu gradele mai mari sau egale cu
1000-900=100. Am obţinut rezultatul căutat, deoarece în G vârfurile Xj şi xj sunt adiacente dacă si numai
dacă i si j se cunosc între ele.
5.9. Un comis voiajor trebuie să prezinte în N oraşe produsele firmei sale, după care să se
întoarcă în oraşul din care a plecat. Cunoscându-se costul deplasării între oricare două din cele N
oraşe, se cere să se găsească un traseu care să viziteze o singură dată cele N oraşe, astfel încât
costul total să fie minim.
Soluţie:
f
date de intrare:

-114
-
Din fişierul trasee.txt se citesc:
- pe prima linie n şi m (n- numărul de oraşe; m- numărul de costuri)
- pe următoarele m linii triplete de forma x y t cu semnificaţia că între oraşele x si y există un cost t, oraşul
de pornire se citeşte de la tastatură
date de ieşire:
Pe monitor se afişează, oraşele vizitate, în ordine, precum şi costul total al deplasării. Dacă nu există nici o
posibilitate de vizitare în condiţiile cerute, se afişează un mesaj corespunzător.

#include <fstream.h>
#include <conio.h>
int a[20] [20],m,n,x[20],q,nr=l ,timp[ 100],parc[ 100] [ 100]; int ok; void citire()
{
ifstream f("trasee.txt");
f»n»m;
for (int i=l;i<=m;i++)
{
int x,y,t; f'»x»y»t; a[x]
[y]=a[y][x] = t;
}
f.close();
}
int calculQ {
int t=0;
for (int i=l;i<n;i++)
t=t+a[x[i]][x[i+l]]; t=t+a[x[n]][x[q]]; return t;
}
void minim()
{
int min=timp[l],poz; for (int i=l;i<nr;i++)
if (min>timp[i]){ min=timp[i]; poz cout«"\nCostul minim este "«min«endl;
cout«"Drumul parcurs este: for (i=l ;i<=n;i++)
cout«parc[poz][i]<<"
cout«x[qj;
}
void tipar()
{

-115
-
int tp=0;
for (int i=l ;i<=n;i++)
parc[nr][i] = x[i]; tp=calcul(); timp[nrH-]=tp; ok = 1;
}
int solutie(int k)
{
return (k=n);
}
int valid(int k)
{
if (a[x[k]][x[k-l]]~0) return 0; for (int i=l ;i<=k-1 ;i++)
if (x[i]=x[k]) retum 0; if (k=n
&& a[q][x[k]]=0) retum 0; retum 1;
}
void bkt(int k)
{
for (int i=l;i<=n;i++)
{
x[k]=i; if(valid(k))
if(solutie(k)) tipar();
else bkt(k+l);
}

}
void main()
{
clrscr();
citire();
cout«"Oraşul din care porneşte comis-voiajorul:cin»q;
x[i]=q;
bkt(2);
minim();
if (!ok) cout«"Nu exista nici o posibilitate"; getchO;
}

5.10. Un grup de excursionişti vor să viziteze toate cele N cabane între care există trasee
turistice, fără a mai trece printr-o cabană pe care deja au vizitat-o. Unele cabane sunt unite printr- un

-116
-
traseu a cărui parcurgere durează un anumit timp. Ştiind că ei se află la o anumită cabana, x, la care vor sa
şi revină după excursie, găsiţi o modalitate de a realiza aceste vizite într-un timp total cât mai scurt.
Soluţie:
>
date de intrare:
Din fişierul trasee.txt se citesc:
- pe prima linie n si m (n- numărul de cabane; m- numărul de trasee)
- pe urmatoarele m linii triplete de forma x y t cu semnificaţia că între cabanele x si y există un traseu
direct de durata t, cabana de pornire se citeşte de la tastatură
date de ieşire:
Pe monitor se afişează, cabanele vizitate, în ordine, precum şi durata totală a excursiei. Dacă nu există
nici o posibilitate de vizitare în condiţiile cerute, se afişează un mesaj corespunzător, [vezi (7)]

#include <fstream.h>
#include <conio.h>

int a[20][20],m,n,x[20],q,nr=l,timp[100],parc[100][100];
int ok;

void citire()
{
ifstream
f(”trasee.txt");
f»n»m;
for (int i=l ;i<=m;i-H-)
{
int x,y,t;
f»x»y»t;
a[x][y]=a[y][x]=t;
}
f.close();
}

int calcul()
{

-117
-
int t=0;
for (int i=l;i<n;i++)
t=t+a[x[i]][x[i+l]];
t=t+a[x[n]][x[q]]; return t;
}

void minim() {
int min=timp[l],poz; for (int
i=l;i<nr;i++)
if (min>timp[i]){ min=timp[i]; poz=i; }
cout«"\nTimpul minim este "<<min«endl; cout«"Drumul
parcurs este: for (i=l ;i<=n;i++)
cout«parc[poz][i]<<"
cout«x[q];

void tipar()
{
int tp=0;
for (int i=l;i<=n;i++)
parc[nr][i] = x[i]; tp=calcul(); timp[nrH-]=tp; ok = 1;

int solutie(int k)
{
return (k==n);
}

int valid(int k) {
if (a[x[k]][x[k-l]]==0) return 0;
for (int i=l;i<=k-l;i-H-)
if (x[i]=x[k]) return 0; if
(k=n && a[q][x[k]]=0) return 0;
return 1;

-118
-
}

void bkt(int k)
{
for (int i=l;i<=n;i++)
{
x[k]=i;
if(valid(k))
if(solutie(k))
tipar(); else
bkt(k+l);
}

void main()
{
clrscr();
citire();
cout«" Cabana de la care pornesc turiştii: cin»q; x[l]-
q; bkt(2); minim();
if (!ok) cout«"Nu exista nici o posibilitate"; getch();
}

5.11. Să sc determine toate modalităţile în care un cal poate parcurge în întregime o tablă de
şah, de dimensiuni nxn, astfel încât să treacă prin fiecare câmp o singură dată.
Soluţie: Se va considera aşezarea calului pe tablă, la pasul k în poziţia (i j). Din această poziţie,
mutările posibile sunt în următoarele poziţii: (i-1, j-2), (i-2, j-1), (i-2, j+1), (i-1, j+2), (i+1, j+2)
(i+2, j+1), (i+2, j-1), (i+1, j-2). Pentru fiecare din aceste posibile mutări, se va verifica dacă există
posibilităţi de continuare, în caz contrar, revenindu-se la alegerea unei alte mutări, [vezi (5)]
#include <stdio.h>
int a[]= {-1,-2,-2,-1,1, 2, 2,1};
int b[] = {-2, -1, 1, 2, 2, 1,-1,-2};
int x[30][30], n;
void aseaza(int k, int i, int j)
{

-119
-
int t,r,p ;
x[i]D']=k;
if (k=n*n)
{
printf("\n");
for (t=0;t<n;t++)
{
for (r=0;r<n;r++) printf("%3d",x[t][r]);
printf("\n");
}

>
else
for (t=0;t<8;t++)
{
r = i+a[t];p=j+b[t];
if ( (r>=0) && (r<n) &&(p>=0) && (p<n) &&(x[r][p] = 0) )
aseaza(k+l ,r,p);
}
x[i]Q] = 0 ; /* reface poziţia alterata */
}
int main()
{
int ij;
printf("introduceri n:"); scanf("%d",&n); for (i=0;i<n;i++)
for (j=0;j<n;j++) aseaza(ljij); return 0;
Bibliografie

1. D. Acu, P Dicu, M. Acu, A. Acu: Matematici aplicate în economie voii, Editura Univesitatea
“Lucian Blaga”, Sibiu, 2001.
2. C. Berge: Teoria graiurilor şi aplicaţiile ei, Editura Tehnică, Bucureşti, 1969.
3. B. Bollobas: Graph theory. An introductory course, Springer-Verlag, New York, Heidelberg, 1979.
4. A. Lupaş, P. Blaga, A. Mureşan: Matematici aplicate, Editura Editura Alma Mater, Sibiu, 2002.
5. Odagescu, C. Copos, D. Luca, F. Furtuna, I. Smeureanu: Metode si tehnici de programare: Editura
Intact, Bucureşti, 1994.
6. O.Pătrăşcoiu, Gh.Marian, N.Mitroi: Elemente de graiuri si combinatorică. Metode, algoritmi şi
programe. Editura AII, Bucureşti, 1994.

-120
-
7. B.Pătruţ: Aplicaţii in C si C++. Editura Teora, Bucureşti, 1999.
8. I. Tomescu: Probleme de combinatorică şi teoria graiurilor. Editura Didactică şi pedagogică,
Bucureşti, 1981.
9. 1. Tomescu: Introducere în combinatorică: Editura Tehnică, Bucureşti, 1972.
10. Tomescu Ioan: Curs de teoria graiurilor, Editura Univesitatii Bucureşti, Bucureşti, 1978.

-121
-

S-ar putea să vă placă și