Sunteți pe pagina 1din 9

Grafuri orientate

Scurt istoric
Graful este la origine un concept matematic. Teoria grafurilor are o
vechime mult mai mare comparativ cu informatica. n informatic graful este
privit ca o structur de date. O particularitate a grafurilor n informatic este
faptul c de fiecare dat sunt considerate grafuri finite (cu numr finit de
noduri). Informatica a preluat noiunile teoriei grafurilor imaginnd o
multitudine de situaii concrete rezolvabile cu algoritmi ce prelucreaz structuri
asimilate grafurilor.
Euler Leonhard
Nscut la Basel (Elvetia) n 1707, s-a remarcat ca fizician i
matematician. Se apreciaz ca a fost figura predominant a sec. XVIII n
domeniul matematicii Euler este printre cei mai prolifici autori n specialitatea
sa, publicnd pe parcursul vieii peste 70 volume. Moare n anul 1783 la St.
Petersburg, Rusia.
A avut contribuii decisive n demonstrarea unor teoreme matematice, n
teoria numerelor, a funciilor trigonometrice i desigur, a grafurilor.
n 1736, Euler Leonhard publica lucrarea Soluia problemei prin
geometria poziiei (lat. Solutio problematis ad geometriam situs pertinentis) n
care a stabilit o abordare noua a problemei Celor 7 poduri din Koenigsberg
(Poduri peste riul Pregel din Koenigsberg localitate din Prusia sec. XVIII )

Noiunea de graf orientat.


Un exemplu de graf orientat este: reeaua de strzi a unui ora.
Strzile sunt muchii n graf, iar interseciile reprezint vrfurile grafului.
ntruct mergnd pe jos ne putem deplasa pe orice strad n ambele sensuri,

vom spune c din punctul de vedere al pietonilor, graful unui ora este
neorientat.
Cu totul altfel stau lucrurile n ceea ce privete conductorii auto, pentru c
n orice ora exist strzi cu sens unic. Pentru un ofer strzile trebuie s
primeasc n graf o anumit orientare. Desigur c acele strzi pe care se
poate circula n ambele sensuri vor primi orientare dubl. Am ajuns astfel la
noiunea de graf orientat.
Numim graf orientat, o pereche ordonat de mulimi G=(X,U), unde:
X este o mulime finit i nevid numit mulimea nodurilor (vrfurilor);
U este o mulime format din perechi ordonate de elemente ale lui X, numit
mulimea arcelor (muchiilor)
observaii:
Prin noiunea de perechi ordonate nu trebuie
U1

s nelegem c o muchie este mai mare dect alta,

ci pur i simplu c facem deosebire ntre o muchie


de forma (x,z) i o alta de forma (y,x). Cu alte

U2
2

cuvinte muchiile sunt difereniate prin ordinea de

U3
U5

scriere a simbolurilor.
Arcul (x,y) nu este tot una cu arcul (y,x).

U4
3
U6
U7

Graful unui vrf. Mulimile i


Gradul exterior al unui vrf x, notat d*(x),

Figura1

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).

Graf parial i subgraf


Fie graful G = (X,U). Un graf parial al lui G, este un graf G1= (X,V),
cu V

. Altfel spus, un graf parial G1 al lui G, este chiar G, sau se obine

din G pstrnd toate vrfurile i suprimnd nite muchii.


Fie graful G = (X,U). Un graf parial al lui G, este un graf G1= (Y,T),
unde V X i T U , iar T va conine numai muchiile care au ambele
extremiti n Y. Altfel spus, un graf parial G1 al lui G, se obine din G
eliminnd nite vrfuri i pstrnd doar acele muchii care au ambele
extremiti n mulimea vrfurilor rmase.

Reprezentarea grafurilor orientate


Considerm un graf orientat G= (X,U) cu m arce i n noduri.
Cele mai cunoscute forme de reprezentare sunt: matricea de adiacen,
matricea vrfuri arce, matricea drumurilor i listele vecinilor.
Matricea de adiacen
Are aceeai semnificaie ca n cazul grafurilor neorientate: fiecare
element a[i,j], cu i,j {1,2,...,n}, este: 1 dac exist arcul (i,j), respectiv 0 n
caz contrar.
Datorit orientrii, aa cum am mai spus, arcul (i,j) nu este totuna cu
arcul (j,i). Prin urmare, a[i,j] a[j,i]. Aadar matricea de adiacen nu mai
este simetric fa de diagonala principal, aa cum se ntmpla n cazul
grafurilor neorientate.

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}
var i,j: integer;
begin
writeln('Nr. Noduri: '); readln(n);
for i:=1 to n do
for j:=1 to n do
begin
write('[',i,',',j,']=');
readln(a[i,j]);
end;
end;
Procedure afiare_matrice;
{afieaz matricea de adiacen a}
var i,j: integer;
begin
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j],' ');
writeln();
end;
end;

Aplicaie:
Citirea matricei de adiacen dintr-un fiier text
Aceasta este absolut similar cu cea prezentat la grafuri neorientate,
unde a fost explicat pe larg. De fapt, este vorba despre algoritmul de citire a
unei matrice oarecare dintr-un fiier text. Plecm de la presupunerea c
fiierul conine pe primul rnd valoarea lui n, apoi pe fiecare din urmtoarele
n rnduri elementele unei linii a matricei separate de spaii.
Procedure cit_matr_fis;
{citete numrul de noduri si matricea de adiacenta a din fiierul text
cu descriptorul f}
var i,j: integer; nume_fis: string;
begin
write('Dai numele fiierului '); readln(nume_fis);
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
write('Nr. Arce:'); readln(m);
write('Nr. Vrfuri'); readln(n);
{iniializeaz cu 0 toata matricea de adiacenta}
for i:=1 to n do
for j:=1 to n do
a[i,j]:=0;
{citete m perechi (x,y) reprezentnd arcele grafului}
for k:=1 to m do
begin
write('Muchia ',k,': ');
repeat
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;
Aplicaie:

Determinarea gradului exterior i a gradului interior ale unui nod


oarecare x
Scriem o funcie {d_plus(x:integer):integer;} care returneaz, gradul
exterior al nodului x (notat d*(x)).
Gradul exterior al unui nod x este numrul arcelor care ies din nodul
x, adic numrul arcelor de forma (x,j), cu j {1, 2, ... , n}. Lum ca
exemplu graful cu n=4 noduri de mai jos, mpreun cu matricea sa de
adiacen:

A=

Analizm gradul exterior al nodului 2. Arcele care ies din nodul 2


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

1
4

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.

Nodurile izolate ntr-un graf orientat


Se citesc de la tastatur m perechi de numere ntregi (x,y) reprezentnd
extremitile arcelor unui graf orientat cu n noduri i m arce. S se
stabileasc dac n graful astfel definit exist noduri izolate (prin care s nu
treac nici un arc).
ntreaga rezolvare este cuprins n procedura {noduri_izolate;} fr
parametri.
Mai nti citim numrul de noduri n i numrul de arce m. Definim doi
vectori:
- dp va conine gradele exterioare (d*) ale tuturor nodurilor;
- dm va conine gradele interioare (d-) ale tuturor nodurilor.
Astfel, dp[i] i dm[i] vor fi gradul exterior respectiv gradul interior al
nodului i, pentru i=1, 2, ..., n. Iniializm cu 0 toate gradele exterioare i
interioare ale tuturor nodurilor: ntr-un ciclu cu i de la 1 la n, facem
atribuirile dp[i]:=0 i dm[i]:=0

Un nod x se numete izolat dac prin el nu trece nici un arc. Altfel spus, nu
iese nici un arc din el i nu intr nici un arc n el, adic dp[x]=dm[x]=0. n
continuare, vom numra nodurile izolate n variabila nr, pe care o iniializm
cu 0.

Bibliografie: www.didactic.ro
ro.wikipedia.org/wiki/Graf
grupa1info.blogspot.com/2010/04/teoriegrafuri-orientate_29.html

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