Documente Academic
Documente Profesional
Documente Cultură
Galati
Grafuri orientate
Elev:Lepdatu Alexandru
Profesor indrumator
Clasa a-XII-a E
Burlacu Ctlina
PROMOTIA 2015
1
CUPRINS
1. Motivatia lucrarii....................................................................3
2. Grafuri orientate-notiuni de baza...........................................4
a) Notiunea de graf orientat..................................................4
b) Definitie............................................................................6
3. Graful unui varf......................................................................6
a) Multimile si ................................................................6
4. Graf partial si subgraf............................................................7
5. Reprezentarea grafurilor orientate.........................................8
6. Matricea de adiacenta............................................................9
a) Citirea de la tastatura si afisarea matricei de
adiacenta.............................................................................9
b)Citirea matricei de adiacenta dintr-un fisier text..............11
c)Construirea matricei de adiacenta prin citirea
arcelor de la tastatura....................................................11
d)Determinarea gradului exterior si a gradului
interior al unui nod oarecare x......................................13
7. Matricea varfurilor-ace .......................................................16
8. Listele vecinilor...................................................................18
9. Reprezentarea grafului ca un vector de muchii...................19
10.
Nodurile izolate intr-un graf
orientat..................................19
11.
Celebritate..................................................................22
12.
Interpretarea
datelor............................................................23
13.
Drumuri si circuite in grafuri
orientate...............................25
14.
Matricea
drumurilor............................................................27
15.
Algoritmul Roy-Warshall de determinare a matricei
drumurilor...........................................................................28
16.
Bibliografie.........................................................................35
Motivatia lucrarii
Un graf este o submultime de obiecte (numite noduri)
legate intre ele printr-o multime de muchii carora le pot fi
atribuite directii (in acest caz, se spune ca graful este
orientat). Vizual, un graf poate fi reprezentat ca o multime
de puncte legate intre ele prin linii (de obicei curbe).
Grafurile au fost studiate intensiv de numerosi
matematicieni si fizicieni precum Cayley, pe care l-au
interesat aplicatiile lor in chimia organica, sau Kirchhoff,
care a studiat aceasta categorie pornind de la studiul
retelelor electrice.
Grafurile au o importanta imensa in informatica, de
exemplu: in unele probleme de sortare si cautare
elementele multimii pe care se face sortarea sau cautarea
se pot reprezenta prin noduri intr-un graf; schema logica a
unui program se poate reprezenta printr-un graf orientat in
care o instructiune sau un bloc de instructiuni este
reprezentat printr-un nod, iar muchiile directionate
reprezinta calea de executie; in programarea orientata pe
obiecte, ierarhia obiectelor (claselor) unui program poate
fi reprezentata printr-un graf in care fiecare nod reprezinta
o clasa, iar muchiile reprezinta relatii intre acestea
(derivari, agregari).
De asemenea m-a captivat acest capitol al informaticii
si de aceea am ales aceasta tema.
totul
altfel
stau
lucrurile
ceea
ce
privete
este
mulime
format
din
ordonate de
perechi
elemente
Observaii:
Prin
noiunea
de
perechi
U1
ntre
muchie
U2
2
de
U3
U5
U4
3
U6
U7
Figura1
arcul (y,x).
Exemplu:
Pentru graful G=(X,U) din figura 1 avem: X={1, 2, 3, 4}
i U={u1, u2, u3, u4, u5, u6, u7,}= {(1,1), (2,1), (3,2),
(2,3), (2,4), (3,4), (3,4)}
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)
b) 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.
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).
mulimea
nodurilor
ce
constituie
mulimea
nodurilor
ce
constituie
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.
Exemplu:
n graful din figura 1, pentru nodul 2, avem:
+(x) = {(2,1), (2,3), (2,4)}, -(x) = {(3,2)}
V U
Exemplu:
Se consider graful G = (X,U) din figura 2, n care X =
{1,2,3,4,5,6} i U={u1, u2, u3, u4, u5, u6, u7}.
Construim
graful
parial
G1
(X,V),
unde
1
u1
u4
u2
u3
5
u7
2
u3
u4
u5
mulimii nodurilor
u4
5
u7
u6
6
Figura 2
5
u7
u6
u5
u6
6
Figura 4
Figura 3
rmase.
mai
cunoscute
forme
de
reprezentare
sunt:
6. Matricea de adiacen
Are
aceeai
semnificaie
ca
cazul
grafurilor
Exemplu:
Pentru
graful
G=(X,U)
din
figura
5,
matricea
de
adiacen este:
coloana
A=
Aplicaie:
a)Citirea de la
afiarea
adiacen
1
4
Figura 5
tastatur
matricei
de
10
citire_matrice()
//citete
matricea
de
adiacen a de la tastatur
{int i,j;
cout<<Nr. Noduri; cin>>n;
for(i=1;i<=n;i++)
{for(j=1;j<=n;i++)
{cout<<[<<i<<<<<<j<<]=);
cin>>a[i][j];}}}
int
afiare_matrice()
//afieaz
matricea
adiacen a
{int i,j;
{for(i=1;i<=n;i++)
{
{for(j=1;j<=n;j++)
Cout<<a[i][j]
cout<<endl;}}}
Aplicaie:
b) Citirea matricei de adiacen dintr-un fiier text
11
de
fiierul
conine
pe
primul
rnd
cit_matr_fis()
matricea
de
//citete
adiacenta
numrul
//din
de
fiierul
noduri
si
text
cu
descriptorul f
{int i,j;
char nume_fis;
{
Cout<<Dai numele fiierului ; cin>>nume_fis;
Cin>>i>>j;
{for(i=1;i<=n;i++)
{
{for(j=1;j<=n;i++)
Cin>>f;
}
end;
Aplicaie:
c)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
12
Aplicaie:
d)Determinarea gradului exterior i a gradului interior
ale unui nod oarecare x
Scriem
funcie
{d_plus(x:integer):integer;}
care
A=
14
4
de
adiacen
toate
valorile
de
15
Observaie:
Destul
de
asemntor
este
algoritmul
pentru
de
adiacen.
acest
moment
putem
16
Exemplu:
Pentru graful de mai jos cu n=4 noduri i m=5 arce,
matricea vrfuri arce este:
-1
-1
-1
17
-1
-1
2
u1
u2
1
u4
u3
4
u5
Figura 6
Observaii:
Pe fiecare coloan j (aferent arcului uj), avem exact
dou elemente nenule: un 1 (linia i pe care se afl
reprezint extremitatea iniial a arcului uj) i un -1
(linia i pe care se afl reprezint extremitatea final a
arcului uj)
Numrul valorilor de 1 de pe linia i, reprezint gradul
exterior
al
nodului
(numrul
arcelor
ce
au
ca
18
8. Listele vecinilor
Pentru fiecare nod x se construiesc dou liste ale
vecinilor si:
L*(x) lista vecinilor succesori; conine nodurile ce sunt
extremiti finale ale arcelor care ies din nodul x.
L-(x) lista vecinilor predecesori; conine nodurile ce
sunt extremiti iniiale ale arcelor care intr n nodul x.
Exemplu:
n graful din figura 6 de mai sus, pentru nodul x=4
avem:
arcele care ies din nodul 4 sunt (4,2) i (4,3). n
consecin,
lista
vecinilor
succesori
L*(4)
conine
nodurile 2 i 3;
n nodul 4 intr un singur arc, i anume (3,4), motiv
pentru care lista vecinilor predecesori L-(4) conine
doar nodul 3.
Prezentm
continuare
aceste
liste
ale
vecinilor
L*(x)
2
vid
2,4
2,3
L-(x)
vid
1,3,4
4
3
9.
reprezentnd
extremitile
arcelor
unui
graf
rezolvare
este
cuprins
{noduri_izolate;} fr parametri.
20
procedura
nr=0;
for(i=1;i<=n;i++)
if(dp[i]=0) || (dp[i]=0) then
{
Cout<<i<< ;
nr=nr+1;
}
Dup
ncheierea
acestei
parcurgeri,
dac
numrul
22
Int Vect[20],n,m,a[20][20];
Int dp,dm;
Void noduri_izolate()
{int i,j,k,x,y,nr;
Cout<<Nr.arce : ; cin>>m;
Cout<<Nr.noduri : ; cin>>n;
{iniializeaz cu 0 vectorii gradelor dp i dm}
for(i=1;i<=n;i++)
{
dp[i]=0; dm[i]=0;
}
{citete m perechi (x,y) reprezentnd arcele grafului}
for(k=1;k<=m;k++)
23
{Cout<<Arcul<<k<<: ;
do
cin>>x;cin>>y;
while (x>=1) || x(<=n)|| (y>=1) || (y<=n) || (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;}
Cout<<endl;nr=0; {nr=numrul nodurilor izolate}
for(i=1;i<=n;i++)
{dac ambele grade ale lui i sunt 0,am gsit un vrf
izolat, pe care-l afim i incrementm nr}
if (dp[i]=0) || (dm[i]=0) then
{Cout<<i<< ; nr=nr+1;}
Cout<<endl;
if (nr!=0) cout<<Graful are <<nr<< noduri izolate;
else cout<<Graful nu are noduri izolate;}
{noduri_izolate;}
11. 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.
24
0
A
0
0
0
0
1
0
1
0
0
analizm
persoana
3:
concluzie,
celebritate.
persoana
n
graf,
este
existena
ceea
ce
numim
celebritii
se
interpreteaz astfel:
n nodul 3 intr arce ieite din toate celelalte noduri;
din nodul 3 nu iese nici un arc.
25
Rezolvare
n procedura citire_graf se citesc de la tastatur m
perechi de numere ntregi de forma (x,y) reprezentnd
extremitile celor m arce ale grafului, i se constituie
matricea de adiacen a, cu n linii * n coloane.
Algoritmul de cutare a celebritii cuprins n procedura
celebritate.
Pentru nceput, vom cuta o persoan pe care o vom
numi n continuare candidat la celebritate. Memorm
acest candidat n variabila candid. Presupunem c
iniial
candidatul
este
persoana
(candid:=1).
27
do
13.
cin>>x;cin>>y;
while (x>=1) || x(<=n)|| (y>=1) || (y<=n) || (x<>y);
Drumuri si
{pentru
circuite
fiecare
pereche
marcheaz
arcul
matricea de adiacenta}
in
grafuri
a[x][y]=1;}}
orientate
Se
lan
in
intr-un
graf
orientat,
mulime
numete
de
arce
28
u1
u4
u3
u5
5
u7
u6
6
Figura 8
0, n caz contrar.
a[i]
[j]=a[i][k]*a[k][ j];
31
de
cunotin
din
cadrul
grupului
pot
fi
Rezolvare :
Folosim metoda backtracking. Fiecare astfel de circuit
elementar care trece prin toate nodurile grafului, va fi o
soluie
memorat
vectorul
stiv
st.
Aadar
{citire_matrice;}
citete
matricea
de
{valid(p:integer):boolean;}
verific
pentru
se
face
prin
intermediul
unei
variabile
ntr-un
ciclu
nivelele
i=1,
2,
p-1
35
apoi
declanm
lanul
recursiv
int n,xr;
int st[20],a [20][20];
procedure citire_matrice;
{citeste matricea de adiacenta a de la tastatura}
{var I,j:integer;
Cout<< numarul de noduri: ; cin>>n;
for(i=1;i<=n;i++)
for(i=1;i<=n;i++)
{write ([, i, ,, j, ]=); cin>>(a[i, j]);}}
void initializari()
{initializeaza stiva si citeste datele problemei}
Int i;
{cout<<Cine este proprietarul: ; cin>>x;
for(i=1;i<=25;i++)
st();}
Int tipar (int p);
{tipareste o solutie memorata in vectorul st}
{Int k;
Cout<<x<<;
for(i=1;i<=n;i++)
do cout<<st[k] ;
cout<<endl;
36
prin
function valid(int p)
{testeaza daca valoarea pusa pe nivelul p a generat o
solutie valida, returnand TRUE sau FALSE}
Int nr, i, ok;
{{CD-ul poate circula numai intre elevii care se cunosc,
deci elevul st[p-1] trebuie sa il cunoasca pe st[p] pentru
a-i putea da CD-ul mai departe}
ok=1;(TRUE)
if (a[st[p-1], st[p]]==0) then ok=0;
if (ok)
{proprietarul x nu se poate gasi pe un nivel anterior
ultimului}
if (p<n) and (st[p]==x) then ok=0;
if (ok)
{elevul st[p] nu trebuie sa se mai gaseasca pe nivelele
anterioare}
for (i=1;i<=p-1;i++)
if (st[p]==st[i]) ok=0;
valid=ok;
end;
void bktr (int p)
{implementeaza algoritmul de backtracking recursiv}
Int val;
{{in variabila val trec pe rand toate valorile care ar
putea fi incercate pe nivelul p al stivei}
for(i=1;i<=n;i++)
{st[p]=val; {pune o noua valoare pe nivelul p}
if valid(p) {daca solutia obtinuta e valida}
37
tipareste solutia}
else bktr (p+1); {trece la nivelul urmator in stiva,
pentru a completa solutia}}}
{citire_matrice; bktr(1); {plecam de la nivelul 1 pe
stiva}}
38