Documente Academic
Documente Profesional
Documente Cultură
Scurt istoric:
U2
2
U3
U5
scriere a simbolurilor.
Arcul (x,y) nu este tot una cu arcul (y,x).
Exemplu:
U4
3
U6
U7
Figura1
predecesor al lui y. Un arc de forma (x,x), care iese din nodul x i intr tot x,
se numete bucl.
Exemplu:
n graful din figura 1, avem bucla (1,1).
ntr-un graf putem avea dou sau mai multe arce identice.
Exemplu:
n graful din figura 1, exist dou arce identice, u6 = u7 = (3,4)
Definiie
Se numete p-graf, un graf orientat n care numrul arcelor identice
este mai mic sau egal cu o valoare dat p.
n cele ce urmeaz vom analiza numai 1-grafuri fr bucle.
Graful unui vrf. Mulimile i
Gradul exterior al unui vrf x, notat d*(x), reprezint numrul arcelor
care ies din nodul x, adic numrul arcelor de forma (x,z) U.
Analog, se definete gradul interior al unui vrf x, notat d-(x), ca fiind
numrul arcelor care intr n nodul x (de forma (y,x) U).
Exemplu:
n graful reprezentat n figura 1, pentru nodul x=2, avem:
d*(2) =3 exist trei arce care ies din nodul 2, i anume : u2=(2,1),
u4=(2,3) i u5 = (2,4).
d-(2) =1 n nodul 2 intr un singur arc, n spe arcul u3=(3,2).
Se mai definesc urmtoarele mulimi:
x y X x, y U
ale arcelor care pleac din nodul x. Pe scurt, mulimea succesorilor lui x;
x y X y, x U
iniiale ale arcelor care pleac din nodul x. Pe scurt, mulimea predecesorilor
lui x;
Exemplu:
n graful din figura 1, pentru nodul x=2, avem:
- +(2) = {1,3,4} urmare a faptului c muchiile care pleac din
nodul 2 sunt (2,1), (2,3) i (2,4), putem spune c mulimea succesorilor
nodului 2 este {1,3,4}.
- -(2) = {3} n nodul 2 intr doar muchia (3,2), deci mulimea
predecesorilor lui 2 conine doar nodul 3.
+(x) = {u = (x,y)| u U} mulimea arcelor care ies din nodul x;
-(x) = {u = (y,x)| u U} mulimea arcelor care intr n nodul x;
Exemplu:
n graful din figura 1, pentru nodul 2, avem:
+(x) = {(2,1), (2,3), (2,4)}, -(x) = {(3,2)}
Graf parial i subgraf
Fie graful G = (X,U). Un graf parial al lui G, este un graf G1= (X,V),
cu V
u1
u4
u2
u3
u4
u5
5
u7
u3
u6
5
u7
6
Figura 2
u4
u5
u6
6
Figura 3
5
u7
u6
6
Figura 4
coloana
A=
1
4
Continum
aplicaii.
cu cteva
Figura 5
Aplicaie:
Citirea de la tastatur i afiarea matricei de adiacen
Prin citirea matricei de adiacen de la tastatur, putem memora arcele
existente ntre nodurile unui graf. n cazul grafurilor neorientate, citeam doar
poriunea de deasupra diagonalei principale n matrice, deoarece matricea
este simetric. Acum trebuie s citim toate elementele matricei. Avem de-a
face cu algoritmii banali de citire i afiare a unei matrice cu n linii i n
coloane (unde n este numrul de noduri) n dou cicluri for, deci nu
considerm c mai sunt necesare alte explicaii. Prezentm n continuare
procedurile citire_matrice i afiare_matrice.
Procedure citire_matrice;
{citete matricea de adiacen a de la tastatur}
assign(f,nume_fis); reset(f);
readln(f,n);
for i:=1 to n do
begin
for j:=1 to n do read(f,a[i,j]);
readln(f);
end;
close(f);
end;
Aplicaie:
Construirea matricei de adiacen prin citirea arcelor de la
tastatur
Se citesc de la tastatur m perechi de numere ntregi de forma (x,y)
reprezentnd extremitile celor m arce ale grafului, i se construiete
matricea de adiacen a, cu n linii i n coloane.
Mai nti citim m i n (numrul de arce respectiv numrul de noduri),
i iniializm toat matricea de adiacen cu 0, n dou cicluri for. Apoi, ntrun alt ciclu for, cu k de la i la m, citim cele m perechi de ntregi (x,y).
- Citirea fiecrei perechi (x,z) se face cu validare: repet citirea lui x i
y pn cnd ambele valori sunt n intervalul [1,n].
repeat
readln(x,y);
until (x>=1) and x(<=n) and (y>=1) and (y<=n) and (x<>y);
- Pentru fiecare (x,y), marcm n matricea de adiacen existena arcului
(x,y), prin atribuirea a[x,y]:=1. Spre deosebire de grafurile
neorientate, nu se mai face i atribuirea a[y,x]:=1, deoarece arcul (x,y)
nu e identic cu arcul (y,x).
Algoritmul prezentat a fost inclus n procedura citire_graf.
Procedure citire_graf;
var i, j, k, x, y: integer;
begin
A=
Analizm
gradul exterior al
ies din nodul 2
sunt: (2,1), (2,3), (2,4) (nu i (4,2)). Urmare a existenei acestor arce, n
matricea de adiacen vom avea a[2,1] = a[2,3] = a[2,4] = 1. Unde se gsesc
n matricea de adiacen toate valorile de 1 corespunztoare arcelor ce ies
din nodul 2? Pe linia 2! Pe caz general, valorile de 1 de pe linia x n matricea
de adiacen, reprezint arcele care ies din nodul x. Deci gradul exterior al
nodului x, adic numrul arcelor care ies din nodul x este egal cu numrul
valorilor de 1 de pe linia x a matricei.
Aadar algoritmul implementat n funcia d_plus este foarte simplu:
Iniializm cu 0 o variabil nr. n care numrm valorile de 1 de pe linia x a
matricei. ntr-un ciclu, parcurgem coloanele j=1, 2, ..., n ale liniei x. Pentru
fiecare valoare a lui j, testm elementul a[x,j] de pe linia x i coloana j. Dac
aceasta are valoarea 1, atunci incrementm nr. n final funcia va returna
ultima valoare a variabilei nr.
Function d_plus(x:integer):integer;
{returneaz gradul exterior d* pentru un nod x; acesta este numrul
valorilor de 1 de pe linia x a matricei de adiacenta}
var nr.,j: integer;
begin
nr.:=0;
for j:=1 to n do
if a[x,j] = 1 then nr:=nr + 1;
d_plus:=nr;
end;
Observaie:
Destul de asemntor este i algoritmul pentru determinarea gradului
interior al nodului x (d- (x) ). Acesta reprezint numrul arcelor care intr n
nodul x, adic numrul arcelor de forma (i,x), cu i {1, 2, ..., n}. S vedem
unde se regsesc n matricea de adiacen arcele care intr n nodul x, lund
ca exemplu x=4 pentru graful anterior. Arcele care intr n nodul 4 sunt (3,4)
i (2,4). Rezult c n matrice avem a[3,4] = a[2,4] = 1. Am reperat astfel
valorile de 1 de pe coloana 4 a matricei de adiacen. n acest moment putem
concluziona c gradul interior al unui nod oarecare x reprezint numrul
valorilor de 1 de pe coloana x a matricei. Se poate scrie o funcie
asemntoare cu cea de mai sus, care s returneze cte valori de 1 se gsesc
pe coloana x.
function d_minus(x: integer): integer;
{returneaz gradul interior d- pentru un nod x; acesta este numrul
valorilor de 1 de pe coloana x a matricei de adiacenta}
var nr, i: integer;
begin
nr:=0;
for i:=1 to n do
if a[i,x]=1 then nr:=nr+1;
d_minus:=nr;
end;
Matricea vrfuri arce
Este o matrice b cu n linii i m coloane, n care fiecare element b[i,j]
este:
-1
-1
-1
-1
-1
u2
u1
1
u4
u3
4
u5
Figura 6
L*(x)
2
vid
2,4
2,3
L-(x)
vid
1,3,4
4
3
readln(x,y);
until (x>=1) and (x<=n) and (y>=1) and (y<=n) and (x<>y);
{pentru fiecare arc (x,y), incrementeaz gradul exterior al lui x i
gradul interior al lui y}
dp[x]:=dp[x]+1; dm[y]:=dm[y]+1;
end;
writeln; nr:=0; {nr=numrul nodurilor izolate}
for i:=1 to n do
{dac ambele grade ale lui i sunt 0,am gsit un vrf izolat, pe care-l
afim i incrementm nr}
if (dp[i]=0) and (dm[i]=0) then
begin
write(i,' '); nr:=nr+1;
end;
writeln;
if nr<>0 then writeln('Graful are ',nr, ' noduri izolate')
else writeln ('Graful nu are noduri izolate');
end;
begin
noduri_izolate;
end.
Celebritate.
Se d un grup format din n persoane, care se cunosc sau nu ntre ele. De
la tastatur se introduc m perechi de numere ntregi (x,y) cu semnificaia
persoana x cunoate pe persoana y. relaia de cunotin nu este neaprat
reciproc. Numim celebritate, o persoan care este cunoscut de ctre toate
celelalte persoane din grup, dar ea nu cunoate pe nici un alt membru al
grupului. S se determine dac din grup exist o astfel de celebritate.
Interpretarea datelor.
Problema poate fi modelat ntr-un graf orientat, n care nodurile sunt
persoanele 1,2,3...n, iar arcele sunt relaiile de cunotin ntre aceste
1
1
0
0
0
0
0
1
0
0
readln(x,y);
until (x>=1) and (x<=n) and (y>=1) and (y<=n) and (x<>y);
{pentru fiecare pereche marcheaz arcul in matricea de adiacenta}
a[x,y]:=1;
end;
end;
procedure celebritate;
var i, j, candid, nr : integer;
begin
candid:=1; {candid va reprezenta candidatul la celebritate, care
iniial este persoana 1}
for i:=2 to n do
{daca candidatul l cunoate 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 l cunosc pe candidatul
candid}
for i:=1 to n do
if a[i, candid]=1 then nr:=nr+1;
{verificam daca intr-adevr 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.
Drumuri si circuite in grafuri orientate
Se numete lan intr-un graf orientat, o mulime de arce L={u1,u2,...,uk},
cu proprietatea ca oricare doua arce vecine in mulime au o extremitate
comuna.
Un lan este de fapt un traseu care unete prin arce doua noduri numite
extremitile lanului, fr a tine cont de orientarea arcelor componente.
u2
1
u1
u4
2
u3
u5
5
u7
u6
6
Figura 8
Matricea drumurilor.
Este o matrice d cu n linii i n coloane, n care fiecare element d[i,j] este
:
- 1, dac exist drum de la nodul i la nodul j n graf;
- 0, n caz contrar.
Algoritmul Roy-Warshall de determinare a matricei drumurilor
Matricea drumurilor se obine aplicnd matricei de adiacen
transformri succesive. Vom spune c exist drum de la nodul i la nodul j,
dac gsim un nod k (diferit de i, j) cu proprietatea c exist drum de la i la k
i drum de la j la k. Astfel:
un element a[i, j] care este 0, devine 1, dac exist un nod k astfel
nct a[i, k]=1 i a[k, j]=1. Pentru a gsi arcele nodului k, trebuie
parcurse pe rnd n varianta k toate nodurile 1, 2, , n.
for k:=1 to n do
for i:=to n do
{ik}
for j:=1 to n do {jk}
if (a[i, j]=0) and (i<>k) and (j<>k) then
a[i, j]:=a[i,k]*a[k, j];
Atribuirea a[i, j]:=a[i,k]*a[k, j] este o scriere elegant a regulii de
mai sus:
Un CD valoros
ntr-un grup sunt n elevi, biei i fete, pe care-i numerotm 1, 2,
, n. Fiecare elev cunoate o parte dintre ceilali elevi. Relaia de
cunotin nu este neaprat reciproc (dac x l cunoate pe y, asta nu
nseamn c i y trebuie s l cunoasc pe x). Unul dintre elevi are un CD
foarte valoros, cu multe jocuri demonstrative, pe care toi membri grupului
vor s-l aib fie i pentru scurt timp, pentru a i-l copia pe calculatorul
propriu. CDul circul printre membrii grupului n felul urmtor: fiecare
elev dup ce l-a primit de la altcineva l d mai departe, dar numai unui elev
pe care l cunoate, pentru c nu dorete s ajung n mna unor persoane n
care nu poate avea ncredere. Determinai o modalitate (dac exist) prin
care CD-ul s circule exact o singur dat pe la fiecare elev, transmiterea lui
fcndu-se numai ctre o cunotin, iar n final CD-ul s ajung din nou la
proprietarul su.
Interpretarea datelor
Relaiile de cunotin din cadrul grupului pot fi reinute ntr-o
matrice a cu n linii i n coloane, n fiecare element a[i, j] este: 1 dac elevul
i l cunoate pe elevul j, respectiv 0 n caz contrar. Cu datele problemei
putem construi un graf n care nodurile sunt elevii 1, 2, 3,, n, iar arcele
sunt relaiile de cunotin din grup. Astfel, va exista arc de la nodul x la
nodul y dac elevul x n cunoate pe elevul y. ntruct n enun se precizeaz
c relaiile de cunotin nu sunt neaprat reciproce (x cunoate pe y nu
if ok then
{elevul st[p] nu trebuie sa se mai gaseasca pe nivelele anterioare}
for i:=1 to p-1 do
if st[p]= st[i] then ok:=FALSE;
valid:=ok;
end;
procedure bktr (p:integer);
{implementeaza algoritmul de backtracking recursiv}
var val:integer;
begin
{in variabila val trec pe rand toate valorile care ar putea fi incercate pe
nivelul p al stivei}
for val:=1 to n do
begin
st[p]:=val; {pune o noua valoare pe nivelul p}
if valid(p) then {daca solutia obtinuta e valida}
{o solutie e finala daca CD-ul a trecut pe la n elevi (p=n) si ultimul e
proprietarul (st[p]=x)}
if (p=n) and (st[n]=x) then tipar (p) {daca e si finala, tipareste
solutia}
else bktr (p+1); {trece la nivelul urmator in stiva, pentru a
completa solutia}
end;
end;
begin;
initializai; citire_matrice; bktr(1); {plecam de la nivelul 1 pe stiva}
end.
BIBLIOGRAFIE: www.didactic.ro
grupa1info.blogspot.com/2010/04/teoriegrafuri-orientate_29.html
Ro.wikipedia.org/wiki/Graf