Documente Academic
Documente Profesional
Documente Cultură
Drumuri in Grafuri
Drumuri in Grafuri
Lucrare de atestat
Drumuri n grafuri
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
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
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.
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.
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.
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;
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.
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.
17
BIBLIOGRAFIE:
1. Manual clasa a XI-a, editura Niculescu; 2. Tehnici de programare, Tudor Sorin
18