Sunteți pe pagina 1din 18

GRUP SCOLAR HORIA VINTILA SEGARCEA

Lucrare de atestat
Drumuri n grafuri

Realizat de: Barbu Maria Alexandra Profesor ndrumtor: Badea Ileana

SEGARCEA 2012
Barbu Maria Alexandra

CUPRINS :

1. 2. 3. 4. 5.

GRAFURI ORIENTATE- NOIUNI DE BAZ NOIUNEA DE GRAF ORIENTAT GRADUL UNUI VRF. MULTIMEA SI . DRUMURI I CIRCUITE N GRAFURI

ORIENTATE
MATRICEA DRUMURILOR

Barbu Maria Alexandra

Cap I: INTRODUCERE 1.1. NOIUNI GENERALE DESPRE GRAFURI ORIENTATE

Defini ii: Numim graf orientat, o pereche ordonata de multimi G=(X,U), unde: -X este o mulime finit si nevid numit mulimea nodurilor(varfurilor). -U este o mulime formata din perechi ordonate de elemente ale lui X, numita multimea arcelor (muchiilor). Orice arc u U va fi notat cu u=(x,y) si spunem ca x este extremitatea initial iar y este extremitatea final a arcului u. Atenie!! Arcul (x,y) este diferit de arcul (y,x). Un graf orientat poate fi desenat in plan reprezentand varfurile sale prin puncte, iar arcele sale prin sageti orientate. Exemplu: Fie un graf G=(X, U), X={1, 2, 3}, U={(1, 2), (2, 1), (1, 3)}, acesta se poate reprezenta astfel:

u1 1 u2 u3 3 2

Barbu Maria Alexandra

Gradul unui vrf

Observm c pentru grafuri orientate sunt dou tipuri de arce incidente cu un varf: arce care intr si arce care ies dintr-un varf . Vom defini deci dou concepte distincte care sa corespunda numarului arcelor din fiecare din cele doua categorii. Gradul exterior al unui vrf x, notat d+(x), reprezinta numarul arcelor care ies din nodul x, adica numarul arcelor de forma (x,y) U. Gradul interior al unui vrf x, notat d- (x), ca fiind numarul arcelor care intr n nodul x, de forma (y,x) U. De asemenea vom nota cu: + (x)= {y X/ (x, y) U} multimea succesorilor lui x. - (x)= {y X/ (y, x) U} multimea predecesorilor lui x.

+(x)= {u=(x, y)/ u U} multimea arcelor ce ies din x.


- (x)= {u=(y, x)/ u U} multimea arcelor ce intra in x. Pentru figura anterioar vom avea: d+(1)=2; d- (1)=1; +(1)={2,3}; -(1)={2}; d+(2)=1; d- (2)=1; +(1)={u1,u3}; -(1)={u2}; d+(3)=0; d-(3)=1;

Barbu Maria Alexandra

Defini ii: Fie graful G=(X, U). Un graf par ial al lui G, este un graf G1=(X, V), cu V U. Un graf parial G1 al lui G, este chiar G,sau se obine din G pstrnd toate varfurile si suprimnd nite muchii. Fie graful G=(X, U). Un subgraf al lui G, este un graf G1 =(Y, T), unde Y X si TU, iat T va conine numai muchiile care au ambele extremiti in Y. Un graf partial G1 al lui G, se obtine din G eliminnd nite varfuri si pastrnd doar acele muchii care au ambele extremiti in mulimea vrfurilor rmase. Exemplu: Fie D1=(1, 2, 3, 4, 5, 6, 4 , 1), D2=(1, 2, 3, 4, 1) si D3=(4, 5 ,6 ,4) sunt circuite dar numai D2 si D3 sunt elementare.
2

u1
1

u2

u4 u7
5 4

u3 u6 u5
6

Pentru graficul de sus , avem G1=(X, U), V={u1, u2, u3, u7, u6} este graf parial, iar H=(Y, Z) cu Y={1, 2 ,3 ,4} si Z={u1, u2, u3, u4} este subgraful lui G indus de mulimea de vrfuri Y.

Barbu Maria Alexandra

Matricea drumurilor va fi aprofundat la drumuri i circuite n grafuri orientate. Defini ii: Fie un graf G=(X,U). Se numeste lant intr-un graf orientat, o multime de arce L={u1, u2,, uk}, cu proprietatea ca oricare doua arce vecine in multime au o extremitate comuna. Se numeste drum in graful G, un ir de noduri D=[z1, z2,.., zk] , unde z1,z2,,zk X, cu proprietatea ca oricare doua noduri consecutive sunt adiacente , adica exista arcele [z1, z2],[z2, z3],,[zk-1, zk] U. Daca nodurile z1, z2,, zk sunt distincte doua cate doua, drumul se numeste elementar. In caz contrar, drumul este ne-elementar. Se numeste circuit ntr-un graf, un lan L=[z1, z2 ,zk] cu proprietatea c z1=zk si arcele [z1, z2], [z2, z3],[zk-1, zk] sunt distincte dou cte dou. Daca ntr-un circuit toate nodurile cu excepia primului i a ultimului sunt distincte doua cate doua, atunci circuitul se numeste elementar. In caz contrar, el este ne-elementar.

Barbu Maria Alexandra

CAPITOL II DRUMURI MINIME SI MAXIME IN GRAFURI ORIENTATE


Considerm un graf orientat G=(X, U) cu n noduri. Fiecarui nod i se atribuie un numar intreg numit cost. Semnificatia acestui cost poate fi variata in functie de domeniul pe care il descrie graful. Astfel, daca graful reprezinta harta unui oras in care arcele sunt strazile iar nodurile sunt intersectiile dintre strazi, atunci putem vorbi despre costul deplasarii cu automobilul intre doua intersectii, de-a lungul unei strazi. Costul s-ar putea masura in cantitatea de benzina consumata, calculata prin prisma lungimii strazii in m sau km. 2.1. MATRICEA COSTURILOR Pentru a evidentia costurile tuturor arcelor unui graf cu n noduri se poate defini o matrice a, cu n linii si n coloane. Exista dou forme ale acestei matrici: A) Se utilizeaza pentru determinarea drumurilor de cost minim intre doua noduri iar forma B) este utilizata pentru determinarea drumurilor de cost maxim. Pentru Fiecare element a[i,j] poate fi: - c, daca exista un arc de cost c>0 intre nodurile i si j; - 0, daca i=j; -+, daca nu exista arc intre nodurile i si j. B) Este absolut similara cu deosebirea ca in loc de + avem -. Forma determinarea drumului minim si maxim se utilizeaza:

Barbu Maria Alexandra

2.2. ALGORITMUL ROY-FLOYD Se considera un graf orientat cu n noduri pentru care se da matricea costurilor in forma A). Se cere ca, pentru fiecare pereche de noduri (i,j), sa se tipareasca costul minim de la i la j. Plecam de la ideea urmatoare: daca drumul minim intre doua noduri oarecare i si j trece printr-un nod k, atunci drumurile de la i la k si de la k la j sunt la randul lor minime. Pentru fiecare pereche de noduri (i,j), cu i,j {1, 2,.., n}, procedam astfel: Dam lui k pe rand valorile 1, 2,.., n , pentru ca nodul k poate fi, cel putin teoretic, orice nod al grafului. - Ca suma dintre costul drumului de la i la k si costul drumului de la k la j este mai mica decat costul drumului de la i la j atunci drumul initial de la i la j este inlocuit cu drumul ikj. Aceasta inlocuire se va opera in matricea costurilor:{a[i,j]:=a[i,k]+a[k,j]} - Prezentam procedura generare care contine algoritmul descris: Procedure generare; Var i,j,k:integer; Begin For k:=1 to n do For i:=1 to n do For j:=1 to n do If a[i,k]+a[k,j]<a[i,j] then a[i,j]:=a[i,k]+a[k,j]; End;

Barbu Maria Alexandra

Observa ii: Drumurile minime intre toate nodurile se regasesc la finele algoritmului tot in matricea costurilor, care a suferit n transformari pentru k={1 ,2,.., n}. Unele elemente pot fi +, iar pentru simularea lui + am spus ca se introduce un numar intreg foarte mare. Prin adunari repetate a doua numere intregi foarte mari putem ajunge la un rezultat care depaseste cea mai mare valoare posibila de tipul integer. De aceea, recomandam ca elementele matricei costurilor sa fie de tip longint. In cazul in care problema cerea pentru fiecare pereche de n noduri (i,j) costul drumului maxim, modificarile necesare ar fi minore: - se foloseste forma B) a matricei costurilor; - conditia testata in linia if devine {a[i,k]+a[k,j]>a[i,j]}.

Probleme: Celebritate. Se da un grup format din n persoane, care se cunosc sau nu intre ele. De la tastatura se introduc m perechi de numere intregi (x,y) cu semnificatia persoana x o cunoaste pe persoana y . Relatia de cunostinta nu este neaparat reciproca. Numim celebritate, o persoana care este cunoscuta de catre toate celelalte persoane din grup, dar ea nu cunoaste pe nici un alt membru al grupului. Sa se determine daca in grup exista sau nu o astfel de celebritate. Problema poate fi modelata intr-un graf orientat, in care nodurile sunt persoanele 1, 2,, n, iar arcele sunt relatiile de cunostinta intre aceste persoane. O relatie de cunostinta este de forma (x, y) cu semnificatiapersoana x o cunoaste pe persoana y. De exemplu, daca grupul are n=4 persoane, iar
Barbu Maria Alexandra 9

cele m=5 relatii de cunostinta sunt (1,3), (2, 3), (4, 3), (1, 2), (1, 4), atunci nodul 3 va fi o celebritate. Sa analizam persoana reprezentata prin nodul 3: exista relatii de cunostinta (1, 3), (2, 3), (4, 3), adica persoana 3 este cunoscuta de catre 1, 2, 4. Mai exact, persoana 3 este cunoscuta de toate celelalte persoane din grup; nu exista nici o relatie de cunostinta de forma (3, p).Cu alte cuvinte, persoana 3 nu cunoaste pe nimeni.

In concluzie, persoana 3 este ceea ce numim o celebritate. In graf, existenta celebritatii se interpreteaza astfel: in nodul 3 intra arce iesite din toate nodurile; din nodul 3 nu iese nici un arc. EXPLICA IE: In procedura citire_graf se citesc de la tastatura perechi de numere intregi de forma (x,y) reprezentand extremitatile celor m arce ale grafului, si se construieste matricea de adiacenta a, cu n linii si n coloane. Procedura a fost prezentata ca aplicatie in partea teoretica. Algoritmul de cautare a celebritatii este cuprins in procedura celebritate. Pentru inceput, vom cauta o persoana pe care o vom numi in continuare candidat la celebritate. Memoram acest candidat in variabila candid. Presupunem ca initial candidatul este persoana 1(candid:=1). Cercetam celelalte persoane, intr-un ciclu cu i de la 2 la n. Pentru fiecare persoana i, trebuie sa facem o testare. In cazul in care candidatul actual candid o cunoaste pe persoana i (a[candid,i]este 1) candid nu mai poate fi o celebritate(celebritatea nu trebuie sa cunoasca nici o alta persoana din grup!). In aceasta situatie, noul candidat la celebritate devine i(candid:=i).
Barbu Maria Alexandra 10

La finele parcurgerii de mai sus, in variabila candid vom avea asadar un candidat la celebritate. Mai ramane sa vedem daca acest candidat este cunoscut de catre toate celelalte persoane. In exemplul de mai sus, urmare a faptului ca persoana 3 este celebritate, avem relatiile (1, 3), (2, 3) si (4, 3), adica a[1,3]=a[2,3]=a[4,3]=0. In consecinta, pe coloana 3 avem n-1 valori de 1. Pe caz general, trebuie sa numaram valorile de 1 de pe coloana candid in matricea de adiacenta, iar daca gasim n-1 astfel de valori, atunci persoana candid este intr-adevar celebritate. Program celebru; Var n,m:integer; a:array[a..20,1..20] of integer; procedure citire_graf; var i,j,k,x,y:integer; begin write(nr de arce:);readln(m); write(nr de noduri:);readln(n); {initializeaza cu 0 toata matricea de adiacenta} for i:=1 to n do for j:=1 to n do a[i,j]:=0; {citeste m perechi (x,y) reprezentand arcele grafului} for k:=1 to m do begin write(arcul ,k,:); repeat readln(x,y); until (x>=1) and(x<=n) and (y>=1) and (y>=n); {pentru fiecare pereche marcheaza arcul in matricea de adiacenta} a[x,y]:=1;
Barbu Maria Alexandra 11

end; end; procedure celebritate; var i,j,candid,nr:integer; begin candid:=1; {candid va reprezenta candidatul la celebritate care initial este prima persoana} for i:=2 to n do {daca candidatul il cunoaste pe i, el nu mai poate fi celebritate; noul candidat devine i} if a[candid,i]=1 then candid:=i; nr:=0; {numaram in nr cate persoane il cunosc pe candidatul candid} for i:=1 to n do if a[i,candid]=1 then nr:=nr+1; {verificam daca intr-adevar candid este celebritate} if nr:=n-1 then writeln( persoana ,candid, este celebritate) else writeln(nu exista celebritate in grup); end; begin citire_graf; celebritate end.

unit ugraph; interface


Barbu Maria Alexandra 12

type matrice=array[1..20,1..20]of integer; var a:matrice; n,m:integer; procedure citire_matrice; procedure afisare_matrice; procedure grad_exterior(x:integer) ; procedure grad_interior(x:integer); implementation procedure citire_matrice; var i,x,y:integer; begin write ('numarul de noduri:');readln(n); for i:=1 to n do a[i,i]:=0; write('numarul de arce:');readln(m); for i:=1 to m do begin write('arcul ',i,':'); repeat readln(x,y); until (x>=1) and(x<=n) and (y>=1) and (y<=n); a[x,y]:=1; end; end; procedure afisare_matrice; var i,j:integer; begin for i:=1 to n do begin for j:=1 to n do write(a[i,j],' ');writeln;
Barbu Maria Alexandra 13

end; end; procedure grad_exterior; var i,gr:integer; begin gr:=0 for i:=1 to n do gr:=gr+a[x,i]; writeln('gradul exterior al lui ',x,'este :',gr); end; procedure grad_interior; var i,gr:integer; begin gr:=0; for i:=1 to n do gr:=gr+a[i,x]; writeln('gradul interior al lui ',x,' este:',gr); end; procedure omega_plus; begin end; procedure omega_minus; begin end; procedure gama_plus; var i:integer; begin writeln('multimea extremelor finale ale arcelor care pleaca din ',x,':'); for i:=1 to n do if a[x,i]=1 then write(i,' ');
Barbu Maria Alexandra 14

end; procedure gama_minus; var i:integer; begin writeln('multimea extremelor initiale ale arcelor care intra in ',x,':'); for i:=1 to n do if a[i,x]=1 then write(i,' '); end; begin end. Problem: Se citeste de la tastatura matricea de adiacenta a unui graf orientat cu n noduri. Sa se afiseze nodurile cu proprietatea ca numarul arcelor care ies din nod este maxim. Program d_maxim; Var a:array[1..20,1..20] of integer; i,j,x,n,max:integer; procedure citire; var i,j,n:integer; begin for i:=1 to n do begin for j:=1 to n do write(a[,i,,,j,]=); repeat readln a[i,j]; until (a[i,j]=0) or (a[i,j]=1); end; end; function d_plus(x:integer):integer; var i,gr:integer;
Barbu Maria Alexandra 15

begin for j:=1 to n do if a[x,j]=1 then gr:=gr+1; d_plus:=gr; end; begin citire; max:=d_plus(x); for x=2 to n do if d_plus(x)>max then max=d_plus(x); for x=1 to n do if d_plus(x)=max then write(x,); end. Problem: Se citeste de la tastatura matricea de adiacenta a unui graf orientat cu n noduri. Sa se tipareasca nodurile cu proprietatea ca numarul arcelor care ies din nod este egal cu numarul arcelor care intra in nod. Program egalitate; Var a:array[1..20,1..20] of integer; x,i,j,n:integer; procedure citire_matrice; write(n:=);readln(n); begin for i:=1 to n do begin for j:=1 to n do write(a[,i,j,]=); repeat readln a[i,j]; until (a[i,j]=1) or (a[i,j]=0);
Barbu Maria Alexandra 16

end;end; function d_plus(x:integer):integer; var i,gr:integer; begin gr:=0; for j:=1 to n do if a[x,j]=1 then gr:=gr+1; d_plus:=gr; end; function d_minus(x:integer):integer; var i,gr:integer; begin gr:=0; for I:=1 to n do if a[i,x]=1 then gr:=gr+1; d_minus:=gr; end; begin citire_matrice; write(n:);readln(n); d_plus;d_minus; for x:=1 to n do if d_plus(x)=d_minus(x) then write(x,); end.

Barbu Maria Alexandra

17

BIBLIOGRAFIE:
1. Manual clasa a XI-a, editura Niculescu; 2. Tehnici de programare, Tudor Sorin

Barbu Maria Alexandra

18

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