Sunteți pe pagina 1din 28

MINISTERUL EDUCAIEI,CERCETRII,TINERETULUI I SPORTULUI

COLEGIUL TEHNIC MTSARI

ATESTAT PROFESIONAL
Prof.ndrumtor:
Sceanu Ion
Elev:Vlsan Alina Corina
Profil:Matematica-Informatic
Colegiul Tehnic Mtsari

2015
1

MINISTERUL EDUCAIEI,CERCETRII,TINERETULUI I SPORTULUI


COLEGIUL TEHNIC MTSARI

DRUMURI N GRAFURI
ORIENTATE
Prof.ndrumtor:
Sceanu Ion
Elev:Vlsan Alina Corina
Profil:Matematica-Informatic
Colegiul Tehnic Mtsari

2015
2

CUPRINS

Grafuri orientate ..............................................4


Drumuri minime i maxime n grafuri orientate..........5
Altgoritmul lui Dijkstra...........................................8
Altgoritmul lui Roy-Floid..................................12
Drumuri maxime n grafuri orientate.........................16
Grafuri euleriene.....................................................19
Grafuri hamiltoniene........................................24
Bibliografie.....................................................26

Grafuri orientate
Noiuni de baz

Un graf orientat G este format dintr-o pereche ordonat de mulimi G=


(X, U). ca i n cazul grafurilor neorientate, X este mulimea vrfurilor sau
nodurilor grafului. Mulimea U este format din perechi ordonate de elemente
distincte din X, numite arce. Orice arc u U va fi notat prin u= (x, y) cu x, yX
i xy.
Spunem c vrful x este extremitatea iniial a arcului u, iar vrful y este
extremitatea final a arcului u. Spre deosebire de cazul grafurilor neorientate,
notaiile (x, y) i (y, x) vor desemna doua arce diferite.
Dac graful G conine arcul (x, y) vom spune c vrfurile x i y sunt
adiacente n G i amndou sunt incidente cu arcul (x, y). Deci, un graf orientat
G poate fi imaginat c o mulime de vrfuri, dintre care unele sunt unite dou
cte dou prin arce. Un graf orientat poate fi desenat n plan reprezentnd
vrfurile sale prin puncte i arcele prin sgei care sunt orientate de la
extremitatea iniial ctre extremitatea final a fiecrui arc.
Graful orientat G= (X, U) unde:
X= {1,2,..., 8} i U= {(1,2), (2,3), (3,1), (3,2), (2,4), (4,5), (3,5), (6,8), (8,7),
(7,8), (7,6)} se reprezint ca n figur:

u5

u1
1

u3

u4

u7

u2
3

u6

Vom nota arcele aa cum se indic n figur , adic u1=(1,2), u2=(3,1),


., u11=(6,8).

Gradul exterior al unui vrf x, notat prin d+(x), este numrul arcelor de
form (x,y) cu yX. Gradul exterior al unui vrf x, notat prin d-(x),este
numrul arcelor de form (y,x) cu yX.
Un graf parial al unui graf orientat G=(X,U) se definete n acelai mod
ca i n cazul neorientat. El este un graf G1=(X,V) unde VU, deci este graful G
nsui sau se obine din G prin suprimarea anumitor arce.
i definiia unui subgraf al unui graf orientat G=(X,U) este asemntoare
cu cazul neorientat.Prin definiie , un subgraf al lui G este un graf H=(Y,V),
unde YX, iar arcele din V sunt toate arcele din U care au ambele extremiti n
mulimea de vrfuri Y.
Deci un subgraf H al unui graf orientat G este graful G nsui sau se
obine din G prin suprimarea anumitor vrfuri i a tuturor arcelor incidente cu
acestea .
Vom spune c subgraful H este indus sau generat de mulimea de vrfuri
Y.
Astfel,subgraful grafului G din figura ,indus de mulimea de vrfuri Y1
={1,2,4,5} are ca mulime de arce mulimea V 1 ={(1,2), (2,4), (4,5)},iar
subgraful indus de mulimea de vrfuri Y2 ={6,7,8} are mulimea arcelor
V2={(7,6),(6,8),(7,8),(8,7)}.
Un graf orientat este complet dac oricare dou vrfuri sunt adiacente.
n timp ce n cazul neorientat un graf complet cu n vrfuri este unic
determinat, n cazul orientat exista mai multe grafuri complete cu un numr dat
de vrfuri.Ele se deosebesc fie prin orientarea arcelor , fie prin faptul c ntre
dou vrfuri oarecare exista un arc sau dou arce de sensuri contrare.
Un lan al unui graf orientat se definete ca un ir de arce:
L=[u1,u2,..,up]
Cu proprietatea c oricare arc uI din acest ir are comun o extremitate cu ui-1 ,
iar cealalt extremitate este comun cu ui+1 pentru orice i=1,...,p-1.
Dac toate arcele lanului L au aceeai orientare ,care este dat de sensul
deplasrii de la x0 ctre xr lanul se numete drum.
Deci un drum ntr-un graf orientat G=(X,U) este un ir de vrfuri notat :
D=(x0,x1,...,xr)
cu proprietatea c (x0,x1), (x1,x2), .... , (xr-1,xr)U, deci sunt arce ale grafului.
Vrfurile x0 i xr se numesc extremitile drumului D. Dac vrfurile
x0 ,x1 , ... , xr sunt distincte dou cte dou, drumul D se numete elementar. Din
aceste definiii rezult c orice drum este i lan , dac l privim ca un ir de
arce.
Un drum D=(x0, ... ,xr) poate fi interpretat ca fiind traseul unei daplasari
pe arcele grafului n ordinea (x0,x1), (x1,x2), ... , (xr-1,xr).

De aceea drumul D de extremiti x0 i xr , se mai spune c este un drum


de la x0 la xr .Dac x0=xr i toate arcele (x0,x1), (x1,x2), ... ,(xr-1,xr) sunt distincte
dou cte dou, drumul D se numete circuit.
Dac toate vrfurile circuitului, cu excepia primului i a ultimului vrf,
sunt distincte dou cte dou, circuitul se numete elementar.
Noiunile de conexitate i de componenta conexa a unui graf orientat sunt
similare cu cele de la grafurile neorientate , utiliznd noiunea de lan din cazul
grafurilor orientate.
Astfel, un graf orientat G se numete conex dac pentru oricare dou
vrfuri distincte x i y exist un lan de extremiti x i y n G. O component
conexa C a unui graf orientat G se definete ca fiind un subgraf conex maximal
al lui G , deci nu exist nici un lan care s uneasc un vrf din C cu un vrf
care nu aparine lui C.

DRUMURI MINIME I MAXIME N GRAFURI


ORIENTATE
O alt noiune de conexitate care apare numai n cazul grafurilor
orientate este aceea de conexitate tare: Un graf orientat G se numete tare conex
dac pentru oricare dou vrfuri distincte x i y ale lui G exist un drum (x, ... ,y)
de la x la y .Deoarece putem schimba rolul lui x i y uneori definiia unui graf
tare conex se bazeaz pe existena unui drum de la x la y i a unui drum de la y
la x pentru oricare dou vrfuri distincte x i y ale grafului.
Pentru grafurile orientate conexitatea tare implica conexitatea simpl ,
adic orice graf tare conex este i conex.
O component tare conexa a unui graf orientat G se definete ca fiind un
subgraf tare conex maximal C al lui G , deci nu exist drumuri care s uneasc
n ambele sensuri un vrf x din C cu un vrf y al lui G care nu aparine lui C,
pentru orice x i y cu proprietile menionate. Rezult c orice graf tare conex
are o singur componenta tare conexa care conine toate vrfurile grafului.
S considerm o funcie l definit pe mulimea U a arcelor unui graf
orientat G=(X,U) cu valori numere reale pozitive:

l :Ux xR, x 0}.


Aceast funcie asociaz oricrui arc u al grafului lungimea sa notata l(u).
Dac =(x, ... ,y) este un drum de la x la y n graful G, vom defini lungimea
drumului n mod aditiv, prin egalitatea:
l()=u l(u),
adic lungimea unui drum este egal cu suma lungimilor arcelor sale.
Un drum de la x la y se va numi drum minim ( respectiv
maxim)lungimea drumului este minimul ( respectiv maximul) lungimilor
drumurilor de la x la y , presupunnd c mulimea acestor drumuri este nevida.
Totui ntre aceste dou noiuni de drum minim i de drum maxim exist o
deosebire importanta .
Orice drum minim este elementar , deoarece n caz contrar dac un vrf se
repet n irul care definete drumul , subdrumul cuprins ntre dou apariii
consecutive ale unui vrf poate fi eliminat i obinem un drum de lungime strict
mai mic dect drumul presupus minim , ceea ce este absurd.
Deoarece mulimea drumurilor elementare de la x la y este finit pentru
oricare dou vrfuri distincte x i y , rezult c un drum minim de la x la y va
exista ntotdeauna pentru oricare dou vrfuri distincte x i y ale unui graf tare
conex .

Pentru tratarea problemelor de minim vom asocia graful G o matrice a costurilor


C=(cij)nn definit astfel :
l(xi ,xj) daca (xi , xj)U
Cij=

daca i=j

+
daca (xi ,xj)U
Intuitiv,aceast alegere ar nsemna c drumul cel mai scurt de la xi la el
nsui este de lungime 0 iar inexistenta arcului ( xi, xj )este totuna cu existena
7

unui arc de lungime infinit ( care evident nu va interveni niciodat ntr-un


eventual drum minim de la xi la xj ) .

Algoritmul lui Dijkstra


Problem: Fiind dat un graf orientat G=(X,U) , o funcie l:U R+ i un
nod xi0 , s se determine pentru toate vrfurile x i pentru care exist drum de la
xi0 la xi , lungimea celui mai scurt drum precum i unul dintre drumurile minime
de la xi0 la xi.
Algoritmul utilizeaz metoda Greedy genernd drumurile minime n
ordinea cresctoare a lungimilor.
Exemplu:
Pentru graful urmtor , considernd nodul de plecare 1 se vor obine n
ordine:
D1=(1,2) de lungime 1;
D2=(1,2,5) de lungime 2;
D3=(1,2,5,3) de lungime 4;
D4=(1,2,5,3,4) de lungime 5;
Deci pornind din nodul 1 avem n final :
de la 1 la 2 D1 de lungime 1;
de la 1 la 3 D3 de lungime 4;
de la 1 la 4 D4 de lungime 5;
de la 1 la 5 D2 de lungime 2;
de la 1 la 6 nu exist drum.
2

3
1

2
5

3
1

3
6

Se pornete de la vrful xi0 . Evident cel mai scurt drum de la xi0 la unul dintre
celelalte vrfuri ale grafului este dat de arcul (xi0 , xj) de lungime minim .
Urmtorul drum n ordinea lungimilor va fi dat fie de un alt arc cu extremitatea
iniial xi0 fie de un drum (xi0 ,xj ,xp). Alegem n continuare drumuri n ordinea
cresctoare a lungimilor , pn cnd am determinat drumuri minime de la xi0
ctre toate vrfurile pentru care exist drum pornind din xi0.

Pentru aceasta se considera S mulimea vrfurilor xjX pentru care am gsit


drum minim de la xi0 la xj. Iniial S={ xi0 }. La fiecare pas , adugm n S acel
nod xkX \S cu proprietatea c drumul minim de la xi0 la xk are cel mai mic cost
dintre toate drumurile de la xi0 la xp , cu xpX\S.
Pentru exemplul considerat S va avea pe rnd urmtorul coninut:
S={1}
S={1,2}
S={1,2,5}
S={1,2,5,3}
S={1,2,5,3,4}
S observm c drumul minim de la xi0 la xk (xk nodul ce urmeaz s-l
adugm n S la un moment dat) trece numai prin vrfuri din S ( cu excepia lui
xk); ntr-adevr notnd xi primul vrf de pe acest drum ce nu aparine lui S i
presupunnd c xi xk ar rezulta c drumul de la xi0 la xi este mai scurt dect cel
de la xi0 la xk ceea ce ar contrazice alegerea lui xk.
Pentru a alege nodul xk X\S ce urmeaz a fi adugat n S vom folosi un
vector d=( d1 , d2 , ... , dn ) astfel nct
lungimea drumului minim de la xi0 la xi , dac xi S
di=
lungimea drumului minim de la xi0 la xi ce folosete numai
vrfuri din S dac xi S
Iniial di=C(i0 ,i) i=1,n unde C este matricea costurilor .
La un moment dat , adugam n S nodul xk cu proprietatea c
dk=min{dj xjX S }.
Dup adugarea lui xk n S trebuie actualizate valorile lui d pentru
elementele care nu sunt n S , deoarece este posibil ca drumul minim de la xi0 la
unul din aceste noduri ( folosind noduri din S ) s foloseasc nodul xk pe care
tocmai l-am adugat . Fie xj X|S un astfel de nod . Drumul minim de la xi0 la
xj ce folosete noduri din S ( inclusiv xk ) va fi de forma D=(xi0 , ... .... , xk , xj ).
ntr-adevr, presupunnd c exist noduri intermediare xp pe drumul de la xk la xi
adic D=( xi0 , ... ,xk , ... ,xp , ... ,xj ) ar exista drumul mai scurt format din drumul
minim de la xi0 la xp ( care evident nu conine xk deoarece xp a fost adugat mai
nainte la mulimea S ) i secven din D de la xp la xj. Deci pentru xjXS , dj se
modifica dup adugarea lui xk la S numai dac
dk+C(k,j)< , caz n care dj: +C(k,j).
n final , vectorul va conine costurile ( lungimile ) drumurilor minime de
la xi0 la celelalte noduri ; dac pentru un nod xj nu exist drum de la xi0 la xj,
dj= .
Mai jos este prezentat algoritmul n limbaj Pascal. Pentru reprezentarea
mulimii S s-a folosit vectorul caracteristic S cu n componente
9

S[i]=

0 daca xiS
1 daca xiS

Ca mulime de noduri se consider X={1,2, ... ,n} iar lungimile arcelor se


consider numere ntregi
program Dijkstra;
const nmax=15;
inf=maxint div 2;
var c:array[1..nmax , 1..nmax] of integer;
k,i,j,arc,m,n,x,y,z,xp: intrger;
s,d,prec:array[1..nmax] of integer
g: boolean;
procedure min(var k: integer);
var m,i: integer;
begin
m:=inf*2;
for i:=1 to n do
if (s[i]=0) and (d[i]<m) then
begin m:=d[i];
k:=i;
end
end;
procedure drum(i:integer);
begin
if i<>0 then
begin
drum(prec[i]);
write(i);
end
else writeln
end;
begin
writeln( dati nr de noduri ); readln (n);
for i:=1 to n do
forj:=1 to n do c[i,j]:=inf;
for i:=1 to n do c[i,j]:=0;
writeln ( dati nr de arce ); read (arc);
10

for i:=1 to arc do


begin
write ( dati arcul ,i, si lungimea );
readln (x,y,z);
c[x,y]:=z;
end;
read(xp);
for i:=1 to n do begin
d[i]:=c[xp,i];
s[i]:=0;
if c[xp,i]< inf then prec[i]:=xp
else prec[i]:=0;
end;
s[xp]:=1;
prec[xp]:=0;
g:=true;
x:=0;
repeat
min(k);
x:=x+1;
if (d[k]=inf) or (x=n) then g:=false
else begin
s[k]:=1;
for j:=1 to n do
if (s[j]=0)and (d[j]>d[k]+c[k,j]) then
begin
d[j]:=d[k]+c[k,j];
prec[j]:=k;
end;
end;
until (not g);
for i:= 1 to n do
if i<>xp then
if d[i]=inf then
begin
write(Nu exista drum de la ,xp, la,i);
writeln;
end
else begin
writeln(Drum minim de la ,xp,la,i);
drum(i);
writeln
11

end
end.

Algoritmul lui Roy- Floyd


Problem: Fiind dat un graf G=(X,U) cu X={x1 , ... , xn} i o funcie
l:UR+ s se determine pentru fiecare pereche de noduri xi , xj (ij) lungimea
minim a drumurilor de la xi la xj precum i aceste drumuri (n caz c exist
drum de la xi la xj)
Algoritmul Roy Floyd determina lungimile minime ale drumurilor ntre
oricare dou noduri ale grafului ntr-o matrice C=(cij)nn unde

CIJ =

dac i=j
lungimea drumului minim de la xi la xj dac exist
drum de la xi la xj
dac nu exist drum de la xi la xj
Determinarea mtricii C este asemntoare algoritmului Roy-Warshall
pentru obinerea mtricii drumurilor
Se pornete de la matricea costurilor C
for k=1 to n
for i=1 to n (ik)
for j=1 to n (jk)
cij : = min (cij , cik + ckj)
endfor
endfor
endfor
Observaie : Acest algoritm poate fi privit ca o succesiune de n
transformri aplicate mtricii C , o transformare k fiind astfel :
Tk(A) = B, B =(bij)nn , bij= min(aij ,aik+a) i,j { 1 , ... , n}.
Simultan cu determinarea lungimilor minime ale drumurilor , pot fi
reinute i acestea . Vom folosi o matrice D=(dij)nn ale crei elemente dij sunt
mulimi de noduri (dij va reprezenta n final mulimea nodurilor ce pot precede
pe xj n drumul minim de la xi la xj).
Odat cu iniializarea mtricii C cu matricea costurilor vom iniializa i
matricea D astfel :
12

{xi} daca cij si i j


dij=

daca cij= sau i=j


Pe msur ce se actualizeaz matricea C vom actualiza i matricea D
dup cum urmeaz :
- dac cij<cik+ckj , atunci dij rmne neschimbat ;
- dac cij=cik+ckj (nseamn c am gsit noi posibiliti de
construire a drumului minim de la xi la xj folosind nodul k ) se
adug la dij vrfurile din dkj ;
- dac cij>cik+ckj se iniializeaz dij cu dkj .
n final reconstituirea drumurilor minime ntre oricare dou vrfuri xi,xj se
face pornind din xj astfel : precedentul lui xj l alegem din mulimea dij avnd
unul din aceste noduri fixat (s-l numim xg) precedentul acestuia va fi orice nod
din mulimea dig . Procedeul continua pn ajungem la nodul xi .
Observaie : Dac ne intereseaz doar cte un drum pentru fiecare
pereche de noduri xi , xj vom considera n locul mtricii D o matrice D tot nn
astfel nct dij s rein un nod ce-l poate precede pe xj n drumul minim de la xi
la xj .
Mai jos este scris programul Pascal de determinare a tuturor drumurilor minime ntre oricare dou vrfuri ale unui graf G=(X,U) cu X={1 , ... , n}

program roymin;
const nmax=20;
inf=maxint div 2;
{inf poate fi initializat cu o valoare ce depaseste suma tuturor
costurilor}
type multime = set of 1.. nmax;
var c= array[1..nmax , 1..nmax] of word;
{c initial matricea drumurilor}
d: array [1..nmax , 1..nmax] of multime;
dr: array [1..nmax] of 1..nmax;
n,m,i,j.k.lg:word;
procedure initc;
{initializeaza matricea costurilor C}
var i,j,x,y,z: word;
begin
write(` Dati nr de noduri: `);
readln(n);
for i:=1 to n do
begin
13

for j:=1 to n do
c[i,j] := inf;
c[i,i] :=0;
end;
write(`Dati nr de noduri : `);
readln(m);
for i:=1 to m do
begin
write(`Extremitatile si lungimea arcului `,i,`: `);
readln(x,y,z);
c[x,y]:=z;
end;
end;
procedure initd;
{iniializeaza matricea D}
var i,j:integer;
begin
for i:=1 to n do
for j:=1 to n do
if(c[i,j]<inf)and(i<>j) then d[i,j]=[i]
else d[i,j]=[];
end;
procedure drum(i,j:integer);
{genereaza in vectorul dr un drum minim de la i la j pornind din nodul j}
var k: word ;
begin
if i<>j then
begin
for k:=1 to n do
if k in d[i,j] then
begin
lg:=lg+1;
dr[lg]:=k;
drum(i,k);
lg:=lg 1
end;
end
else begin
writeln;
for k:=lg downto 1 do
write(dr[k]:4)
end;
end;

14

procedure afiare;
var i,j:word;
{afiarea rezultatelor}
Begin
for i:= 1 to n do
for j:=1 to n do
begin
writeln:
if c[i,j]=inf then
writeln( nu exista drumuri minime de la ,i, la ,j,)
else
begin
writeln( lungimea drumurilor minime de la ,i, la,j, este
,c[i,j]);
if i<> i then begin
lg:=1;
dr[1]:=j
drum(i,j)
end
end
end
end;
begin
initc;
initd;
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
if c[i,j]>c[i,k]+c[k,j] then
begin
c[i,j]:=c[i,k]+c[k,j]:
d[i,j]:=d[k,j]
end
else
if c[i,j]=c[i,k]+c[k,j] then
d[i,j]:=d[i,j]+d[k,j];
afiare;
end.

15

DRUMURI MAXIME IN GRAFURI


ORIENTATE
Fie G=(X,U) un graf fr circuite cu X={x1 , x2 ,... , xn} i l:UR+ .
Ne punem problema determinrii drumurilor de lungime maxim n acest graf.
Vom ataa grafului G o matrice M=(mij)nn definit astfel :

l(xi , xj) daca (xi , xj)U


mij=

-
0

daca (xi , xj)U si (ij)


daca i=j

Observm c aceasta matrice este asemntoare mtricii costurilor ataat


grafului pentru determinarea drumurilor minime , cu diferena c pentru perechi
de noduri xi , xj (ij) pentru care nu exist arcul (xi,xj) marcm n matrice - .
Intuitiv , aceasta ar nsemna c inexistena arcului (xi , xj) este totuna pentru
studiul drumurilor maxime, cu existena unui arc de lungime - (care evident
nu va interveni niciodat ntr-un eventual drum maxim de la xi la xj) .
Algoritmii de determinare a drumurilor minime pot fi adaptai cu mici
modificri pentru determinarea drumurilor maxime. Considernd problema
determinrii drumurilor maxime ntre oricare dou vrfuri xi , xj(ij) pentru care
exist drum de la xila xj , putem utiliza urmtorul algoritm:
Fie M matricea asociat grafului c mai sus , iar D=(dij)nn cu
{xi} daca mij>- si (ij)
dij=

daca mij= - sau i=j

for k=1 to n
for i=1 to n (ki)
for j=1 to n (kj)
if mij<mik+mkj
then mij := mik+mkj
dij := dkj
16

else
if mij := mik+ mkj
then dij:= dij dkj
endif
endif
endfor
endfor
endfor.
n matricea M vom avea n final lungimile drumurilor maxime ntre
oricare 2 noduri iar n dij i ,j{1 , ... , n} vom avea mulimea nodurilor ce pot
precede pe xj ntr-un drum maxim de la xi la xj.
Mai jos este dat programul Pascal de determinare a tuturor drumurilor
maxime ntre oricare dou noduri folosind algoritmul prezentat anterior , pentru
un graf G=(X, U) , X={1 , ... , n} .
program roymax;
const nmax=20;
inf=-(maxint div 2);
type multime = set of 1 .. nmax;
var c: array [1 .. nmax , 1 .. nmax] of integer;
{c initial matricea costurilor}
d: array [1 .. nmax , 1 .. nmax] of multime;
dr: array[1 .. nmax] of 1 .. nmax;
n,m,i,j,k,lg:word;
procedure initc;
{initializeaza matricea costurilor C}
var i,j,x,y,z:word;
begin
write(Dati nr de noduri:);
readln(n);
for i:=1 to n do
begin
for j:=1 to n do
c[i,j]:= inf;
c[i,j]:=0
end;
write(Dati nr de ace :);
readln(m);
for i:=1 to m do
begin
write(Extremitatile si lungimea arcului,i, :);
17

readln(x,y,z);
c[x,y] :=z;
end
end;
procedure initd ; {initializeaza matricea D}
var i,j : integer ;
begin
for i:=1 to n do
for j:=1 to n do
if (c[i,j]> inf) and (i<>j) then d[i,j]:=[i]
else d[i,j]:=[];
end;
prodcedure drum(i,j:integer);
var k:word;
begin
if i<>j then
begin
for k:=1 to n do
if k in d[i,j] then
begin
lg:= lg+1;
dr[lg]:=k;
drum(i,k),
lg:=lg-1
end;
end
else begin
writeln;
for k:=lg downto 1 do
write(dr[k]:4)
end;
end;
procedure afisare;
var i,j:word;
begin
for i:=1 to n do
for j:=1 to n do
begin
writeln;
if c[i,j]=inf then
writeln( nu exista drum intre ,i, si ,j)
else
begin
18

writeln(Lungimea drumurilor maxime de la,i,la,j, este


,c[i,j]);
if i<>j then begin
lg:=1;
dr[1]:=j;
drum(i,j)
end
end
end
end;
begin
initc;
initd;
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
if (c[i,k]<>inf) and (c[k,j]<>inf) then
if (c[i,j]<c[i,k]+c[k,j] ) then
begin
c[i,j]:=c[i,k]+c[k,j];
d[i,j]:=d[k,j];
end
else
if c[i,j]=c[i,k]+c[k,j] then d[i,j]:=d[i,j]+d[k,j];
afisare;
end.

Grafuri euleriene

Adeseori suntem tentai s credem simplul fapt de a traversa strzi sau poduri
nu implic nici o idee deosebit. Iat ns c exist o celebr problem de
traversare n care singura idee implicat este aceea de traversare, problema
celor apte poduri din Knigsberg. Aceast banal i totui foarte
controversat problem a dus la apariia i dezvoltarea teoriei grafurilor.
Problema se pune cam aa:
19

Figura 1.

Oraul Knigsberg era aezat pe coasta Mrii Baltice, la gurile rului Pregel. Pe
ru erau dou insule legate de rmuri i ntre ele de apte poduri ca n figura 1.

Oamenii care cutreierau aceste insule au observat c dac porneau de pe malul


sudic al rului, nu puteau s-i planifice plimbarea astfel nct s traverseze
fiecare pod o singur dat. Se prea c ori trebuia s sar un pod ori s-l
traverseze de dou ori.
n anul 1735 Euler a descoperit c nu mai are rost s se ncerce, propunnd
urmtoarea analiz a problemei, din punct de vedere matematic:
S considerm mai nti insula estic (fig.2.):

sunt trei poduri care duc la ea. Deoarece


se pleac de pe malul sudic, nseamn c
se pleac din afara insulei estice.
Deoarece fiecare din cele trei traversri
trebuie efectuate o singur dat,
plimbarea trebuies se termine pe insula
estic.
S considerm acum insula vestic:
sunt cinci poduri care duc pe ea, iar cinci este din nou numr impar. Aadar
plimbarea ncepe n
afara

20

insulei, i deci trebuie s se termine pe insula vestic.


Aceasta nseamn c plimbarea se termin n dou locuri diferite simultan ceea
ce e imposibil.
Soluia dat de Euler este tipic pentru personalitatea i ingeniozitatea sa. Tot el
a scris n anul 1736 prima lucrare de teorie a grafurilor despre problema acestor
apte poduri.
Un ciclu al unui graf G care conine toate muchiile lui G se numete ciclu
eulerian. Un graf G care are un ciclu eulerian se numete graf eulerian.
Un graf G fr vrfuri izolate este eulerian dac i numai dac este conex i
gradele tuturor vrfurilor sale sunt numere pare.
Din punct de vedere al teoriei grafurilor, problema se pune cam aa: cele patru
regiuni (insule i maluri) A,B,C,D i cele apte poduri le reprezentm n graful
urmtor (fig.3.):

Muchiile grafului reprezentnd posibilitile


de trecere de pe un mal pe un pod i
reciproc.
Problema are soluie dac acest graf conine
un ciclu eulerian. Un astfel de ciclu,
utilizeaz la fiecare trecere printr-un vrf
dou muchii ce nu mai pot fi folosite pentru
o nou trecere. Cum fiecare dintre cele patru
vrfuri (A,B,C,D) au grade impare, rezult
c ultima muchie va rmne nefolosit sau
va fi folosit pentru a face trecerea de final
Fig.3
( pentru a ncheia plimbarea). Aceasta ar
nsemna c ori va rmne la unul din vrfuri, o muchie nefolosit (fapt ce
demonstreaz c nu avem un ciclu eulerian) ori plimbarea ar trebui s se
termine n mai multe locuri simultan ceea ce e iari imposibil.
Ciclu eulerian: Fiind dat un graf neorientat, s se verifice dac este graf
eulerian i n caz afirmativ, s se determine un ciclu eulerian al su.

Explicaia programului:
Pornim dintr-un vrf neizolat reinut cu ajutorul variabilei prim, n cadrul
procedurii de citire, apoi cutm un ciclu eulerian al grafului printr-un algoritm
backtracking. Vom folosi pentru reinerea ordinii vrfului n ciclul eulerian un
ir s.
21

n cadrul procedurii de cititre a matricii de adiacen, numrm i


muchiile grafului cu ajutorul variabilei m.
Funcia valid verific dac vrful k aparine ciclului eulerian (dac este
adiacent cu vrful anterior determinat, iar n cazul n care este ultimul vrf k=m
dac este adiacent cu primul vfr al ciclului).
Procedura back caut succesiv, autoapelndu-se, vrfuri adiacente cu
vrful anterior determinat pn cnd se ajunge la ultimul vrf al ciclului (k=m);
n acest caz, variabila boolean gsit care a fost iniializat pe false, ia valoarea
true i este tiprit irul s ncheindu-l cu primul vrf al su (pentru a arta c este
un ciclu).
Dac nu a fost gsit nici un ciclu eulerian al grafului dat (gsit=false),
atunci graful nu este eulerian i se tiprete mesaj.
Acelai lucru se ntmpl i dac graful nu are vrfuri neizolate
(prim=0).
program ciclu_eulerian;
uses crt;
type mat=array [1..20,1..20] of integer;
sir=array [1..20] of integer;
var a:mat;s:sir;
n,m,i,j,k,prim:integer;
gasit:boolean;
procedure cit;
begin
write('n=');readln(n);
m:=0;prim:=0;
for i:=1 to n-1 do
for j:=i+1 to n do
begin
write('a[',i,',',j,']=');readln(a[i,j]);
if a[i,j]=1 then
begin
m:=m+1;
prim:=i;
end;
a[j,i]:=a[i,j];
end;
end;
function valid(k:integer):boolean;
var i:integer;
begin
valid:=true;
if a[s[k],s[k-1]]=0 then valid:=false;
22

if (k=m)and(a[s[k],s[1]]=0)then valid:=false;
end;
procedure back(k:integer);
var i,j:integer;
begin
i:=1;
while (i<=n)and(not gasit) do
begin
s[k]:=i;
if valid(k) then
begin
a[s[k],s[k-1]]:=0;
a[s[k-1],s[k]]:=0;
if k=m then
begin
gasit:=true;
writeln('Ciclul eulerian este:');
for j:=1 to m do write(s[j],' ');
writeln(s[1]);
end
else back(k+1);
a[s[k],s[k-1]]:=1;
a[s[k-1],s[k]]:=1;
end;
i:=i+1;
end;
end;
procedure tip;
begin
clrscr;
writeln('Matricea de adiacenta:');
for i:=1 to n do
begin
for j:=1 to n do write(a[i,j],' ');
writeln;
end;
writeln;
end;
begin{PP}
clrscr;
cit;
tip;
if prim<>0 then
23

begin
s[1]:=prim;
gasit:=false;
back(2);
if not gasit then write('Graful nu este eulerian.');
end
else write('Graful nu este eulerian.');
readkey;
end.
n viaa de zi cu zi rezolvm adesea, fr s ne dm seama probleme de grafuri
euleriene, de exemplu cnd vrem s mergem cu trenul n circuit i vrem s
pltim mai puin, calculm n aa fel nct s trecem peste tot i s pltim mai
puin. Dar aceasta nu o facem numai noi i potaii, ci grafurile se utilizeaz la
calcularea poziilor optime de amplasare a sateliilor de comunicaie pentru ca
informaia transmis s foloseasc mai puin timp.

Grafuri hamiltoniene

Se numeste ciclu hamiltonian intr-un graf, un ciclu elementar care contine toate
varfurile grafului.
Un graf care contine un ciclu hamiltonian se numeste graf hamiltonian.
Un lant elementar care contine toate varfurile grafului se numeste lant
hamiltonian.
*
*

Un graf hamiltonian are cel putin trei varfuri.


Graful complet cu n varfuri este un graf hamiltonian.

Teorem:
Fie G=(X,U), cu n>=3 varfuri, daca oricare ar fi x un nod al grafului si
d(x)>=n/2, atunci graful este hamiltonian.
drum hamiltonian: un drum elementar care trece prin toate nodurile grafului;
circuit hamiltonian: un circuit care trece prin toate nodurile grafului;
24

n timp, s-au evideniat o multitudine de probleme reductibile la gsirea unui


drum (sau circuit) hamiltonian ntr-un graf, cum ar fi:
1. Problema potaului (gsirea traseului cel mai scurt care trece pe la toate
locuinele ce aparin de oficiul potal la care lucreaz acesta);
2. Problema adunrii deeurilor (cel mai scurt drum care trece pe la toate
punctele de depozitate a deeurilor);
3. Problema succesiunii operaiilor (executarea mai multor operaii pe o main
n acea ordine n care suma timpilor consumai cu pregtirea mainii pentru
trecerea de la o operaie la urmtoarea s fie minim)
4. Ordinea lipirii unor componente electronice pe o plac, etc;
Determinarea drumurilor hamiltoniene
Problema determinrii drumului (circuitului) hamiltonian de valoare optim s-a
dovedit deosebit de dificil, neexistnd nici acum un algoritm care s rezolve
problema n timp polinomial i nici mcar o metod simpl prin care s se
decid dac ntr-un graf dat exist sau nu drumuri hamiltoniene.
Exist ns mai muli algoritmi, unii exaci alii heuristici, care reuesc, ntr-un
caz sau altul, s rezolve problema satisfctor i n timp util.
Teorema Dac ntr-un graf orientat fr circuite exist un drum hamiltonian
atunci acesta este unic.
Demonstraie Deoarece un drum hamiltonian se identific cu o permutare a
nodurilor grafului, existena a dou drumuri hamiltoniene implic existena a
dou permutri distincte a nodurilor grafului i cum dou permutri distincte
difer prin cel puin o inversiune vor exista dou noduri xi i xj n ordinea xi xj
pe un drum i invers pe cellalt, existnd deci un drum att de la xi la xj ct i de
la xj la xi, cele dou formnd mpreun un circuit, n contradicie cu ipoteza.
Graful din figura 1. Este hamiltonian,
deoarece ciclul C=[1,2,3,5,4,1] este
elementar (pleaca din varful 1 si se
incheie tot in 1, iar muchiile [1,2], [2,3],
[3,5], [5,4] si [4,1] sunt distincte doua
cate doua) si in plus contine toate
varfurile.

25

BIBLIOGRAFIE

1. Manual de informatica pentru clasa a XI-a , George Daniel Mateescu /


Pavel Florin Moraru, Editura Niculescu , 2004
2. Metoda backtracking cu exemple in limbajul Pascal , Tiberiu Socaciu ,
Editura Edusoft , 2005

26

27

28

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