0% au considerat acest document util (0 voturi)
194 vizualizări57 pagini

Grafuri Orientate PDF

Încărcat de

ana19792003
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
194 vizualizări57 pagini

Grafuri Orientate PDF

Încărcat de

ana19792003
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd

5.2. Grafuri orientate.

Terminologie,
noțiuni de bază, forme de reprezentare
 În capitolul "Grafuri neorientate" am dat un exemplu
foarte simplu de graf: reţeaua de străzi a unui oraş.
Străzile sunt muchii în graf, iar intersecţiile reprezintă
vârfurile grafului. Mergând 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.
 În ceea ce priveşte conducătorii auto, pentru că în orice
oraş există străzi cu sens unic deci au o anumită
orientare, putem spune că străzile unui oraș formează
un graf orientat.
Definiţie:
 Numim graf orientat, o pereche ordonată de
mulţimi G= (X,U), unde:
 X este o mulţime finită şi nevidă numită multimea
nodurilor (vârfurilor);
 U este o mulţime formată din perechi ordonate de
elemente ale lui X, numită mulţimea arcelor
(muchiilor)
 Observaţii:
 Prin noţiunea de perechi ordonate înţelegem că o
muchie (x,y) este diferită muchia (y,x).
 Cu alte cuvinte, muchiile sunt diferenţiate prin ordinea
de scriere a simbolurilor.
 Arcul (x,y) nu este tot una cu arcul (y,x).
Exemplu
 Pentru graful G= (X,U) din figura
alăturată, avem:
 X={l,2,3,4}
 U={u1,u2,u3,u4,u5,u6,u7}
sau
 U= {(1,1),(2,1), (3,2),(2,3),(2,4),(3,4),(3,4)}
 Fiecare arc va fi de forma u=(x,y), unde x
se numeşte extremitatea iniţială, iar y se
numeşte extremitate finală a arcului.
 Arcul iese din nodul x şi intră în nodul y.
 La fel ca la grafurile neorientate, vom
spune că nodurile x şi y sunt adiacente,
iar arcul u şi nodul x sunt incidente (la
fel arcul x şi nodul y).
 Nodul y se numeşte succesor al lui x, iar
nodul x se numeşte predecesor al lui y.
 Un arc de forma (x,x), care iese din nodul
x şi intră tot x, se numeşte buclă.
 În graful din figura alăturată, avem bucla
u1=(l, l).
 Într-un graf putem avea două sau mai
multe arce identice: u6 =(3, 4) și u7= (3, 4).

Definiţie
 Se numeşte p-graf, un graf orientat în
care numărul arcelor identice este mai
mic sau egal cu o valoare dată p.

 În cele ce urmează vom analiza numai 1-


grafuri fără bucle.
Gradul unui vârf. Mulțimiile Γ şi ω
 Gradul exterior al unui vârf x, notat d+(x),
reprezintă numărul arcelor care ies din nodul x,
adică numărul arcelor de forma (x,y)U.
 Analog, se defineşte gradul interior al unui vârf x,
notat d-(x), ca fiind numărul arcelor care intră în
nodul x (de forma (y,x)U).
Exemplu
 În graful reprezentat în figura alăturată,
pentru nodul x=2, avem:
 d+(2) =3 pentru că există trei arce care ies
din nodul 2, şi anume: u2= (2,1), u4=(2,3) şi
u5=(2,4).
 d-(2) =1 pentru că în nodul 2 intră un singur
arc, în speţă arcul u3= (3,2).
 Se mai definesc următoarele mulţimi:
 Γ+(x) ={y  X | (x, y)  U}  mulţimea nodurilor ce
constituie extremităţi finale ale arcelor care pleacă din
nodul x. Pe scurt, mulţimea succesorilor lui x;
 Γ-(x) ={y  X | (y, x)  U}  mulţimea nodurilor ce
constituie extremităţi iniţiale ale arcelor care intră în
nodul x. Pe scurt, mulţimea predecesorilor lui x;
 ω+(x) = {u = (x, y) |  U}  mulţimea arcelor care ies din
nodul x;
 ω-(x) = {u = (y, x) |  U}  mulţimea arcelor care intră
din nodul x;
Exemplu:
 În graful din figură, pentru nodul x=2,
avem:
 Γ+(2) = {l,3,4} -> urmare a faptului că
muchiile care pleacă din nodul 2 sunt
(2,1),(2,3) şi (2,4), putem spune că
mulţimea succesorilor nodului 2 este
{1,3,4}.
 Γ-(2) = {3} -> în nodul 2 intră doar muchia
(3,2), deci mulţimea predecesorilor lui 2
conţine doar nodul 3.
 ω+(2) ={(2,1),(2,3),(2,4)}
 ω-(x) ={(3,2)}
Graf parțial şi subgraf în grafuri
orientate
 Fie graful G= (X,U). Un graf parţial al lui G, este un
graf G1= (X,V), cu V  U. Altfel spus, un graf parţial G1
al lui G, este chiar G, sau se obţine din graful G
păstrând toate nodurile şi suprimând nişte arce.

 Fie graful G= (X,U). Un subgraf al lui G, este un graf


G1= (Y,T), unde YX şi TU, iar T va conţine numai
arcele care au ambele extremităţi în Y. Altfel spus, un
graf parţial G1 al lui G, se obţine din G eliminând nişte
noduri şi păstrând doar acele arce care au ambele
extremităţi în mulţimea nodurilor rămase.
Exemplu
 Se consideră graful G=(X,U) din figura alăturată,
în care X={1,2,3,4,5,6} U={u1,u2,u3,u4,u5,u6,u7}.
 Construim graful parţial Gl= (X, V), unde
X={l,2,3,4,5,6}şi V={u2,u3,u4,u6/u7} din graful G au
fost eliminate arcele u1 şi u5.
 Construim subgraful G2= (Y,T), unde
Y={3,4,5,6}şi T={u4,u5,u6,u7}
 Din graful G au fost eliminate nodurile 1 şi 2,
precum şi arcele u1, u2 şi u3 care au o extremitate
în afara mulţimii nodurilor rămase.
Forme de reprezentare a grafurilor
orientate
 Considerăm un graf orientat G= (X, U) cu m arce
şi n noduri.
 Cele mai cunoscute forme de reprezentare sunt:
 matricea de adiacentă,
 matricea vârfuri-arce,
 matricea drumurilor
 listele vecinilor.
Matricea de adiacentă
 Are aceeaşi semnificaţie 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 (zero) în caz
contrar.
 Datorită orientării, aşa cum am mai spus, arcul (i,j) nu
este totuna cu arcul (j,i). Prin urmare, a[i][j]a[j][i].
Aşadar matricea de adiacentă nu mai este simetrică
faţă de diagonala principală, aşa cum se întâmpla în
cazul grafurilor neorientate.
Exemplu
 Pentru graful G= (X,U) din figura 2
3
alăturată, matricea de adiacentă este: 1
4
Coloana 1 2 3 4
0 0 0 0 1
1 0 1 1 2
A= linia
0 0 0 1 3
0 1 0 0 4
Matricea vârfuri-arce
 Este o matrice B cu n linii şi m coloane, în care fiecare
element b[i][j] este:
 1, dacă nodul i este o extremitate iniţială a arcului uj
 -1, dacă nodul i este o extremitate finală a arcului uj;
 0, dacă nodul i nu este o extremitate a arcului uj.
2

u2 u1
Exemplu 1
4
3
 Pentru graful alăturat n=4 noduri şi m=5
arce.
1 0 0 0 0
 Matricea vârfuri-arce este B  
 1 1 1 0 0
B
 Pentru a exemplifica construcţia matricii, 0 1 0 1  1
vom deduce elementele liniei 3:  
0 1  1 1 
 a[3][1]=0 pentru că nodul 3 nu este  0
extremitate a arcului %. Analog,
a [3][3]=0 deoarece nodul 3 nu este
extremitate a arcului u3.
 a[3][5] =-1 deoarece nodul 3 este extremitate
finală a arcului u5.
 a[3][2]=1 şi a[3][4]=1 întrucât nodul 3 este
extremitate iniţială a arcului u2 respectiv u4.
Observație
 Pe fiecare coloană j (aferentă arcului uj), avem exact
două elemente nenule: un 1 (linia i pe care se află
reprezintă extremitatea iniţială a arcului uj) şi un -1
(linia i pe care se află reprezintă extremitatea finală a
arcului uj).
 Numărul valorilor de 1 de pe linia i, reprezintă gradul
exterior al nodului i (numărul arcelor ce au ca
extremitate iniţială pe i), iar numărul valorile de -1 de
pe linia i reprezintă gradul interior al nodului i
(numărul arcele care au ca extremitate finală pe i).
Listele vecinilor
 Pentru fiecare nod x se construiesc două liste ale
vecinilor săi:
 L+ (x)  lista vecinilor succesori; conţine nodurile ce
sunt extremităţi finale ale arcelor care ies din nodul x.
 L-(x)  lista vecinilor predecesori; conţine nodurile ce
sunt extremităţi iniţiale ale arcelor care intră în nodul x.
2

Exemplu: 1
4
3
 În graful din figura alăturată, pentru
nodul x=4 avem:
 arcele care ies din nodul 4 sunt (4,2) şi
(4,3). în consecinţă, lista vecinilor
succesori L+ (4) conţine nodurile 2 şi 3;
 în nodul 4 intră un singur arc, şi anume
(3,4), motiv pentru care lista vecinilor
predecesori L- (4) conţine doar nodul 3.
2
 Prezentăm în continuare aceste liste ale
vecinilor pentru graful din figură.
1
Nodul x L+(x) L-(x) 3 4
1 2 vidă
2 vidă 1,3,4
3 2,4 4
4 2,3 3

 Observăm că L+(x) nu este altceva decât


ansamblul tuturor mulţimilor Γ+ cu x=1,2, ... ,n.
Matricea drumurilor
 Această matrice va fi prezentată în cadrul lecţiei
"Drumuri şi circuite în grafuri orientate".
Reprezentarea grafului ca un
vector de muchii
 Fiecare arc al grafului poate fi privit ca o înregistrare cu
două componente, în speţă cele două noduri care
constituie extremităţile arcului:
 nod_in  nodul din care iese arcul ("nodul de început" al
arcului);
 nod_sf  nodul în care intră arcul ("nodul de sfârşit" al
arcului).
 Putem defini tipul de date ARC, astfel:
typedef struct
{
int nod_in,
nod_sf;
} ARC;
 Graful în ansamblul său, este o mulţime de arce, adică o
mulţime de elemente tipul ARC. Definim graful ca un
"vector de arce", adică un vector de elemente de tipul ARC:
ARC v[25];
 Numărul real de elemente este numărul de arce m. Astfel,
elementele efectiv folosite ale vectorului vor fi v[1],v[2] , ...
,v[m]. Fiecare element v[i] (cu (1,2, ... ,m}) este de tipul
ARC şi reprezintă un arc al grafului, având două
componente:
v[i].nod_in şi v[i].nod_sf nodurile-extremităţi ale arcului.
Aplicație
 Pentru graful orientat G= (X,U) din figură, se cere:
 să se scrie matricea de adiacenta ataşată grafului;
 să se precizeze cât este Γ+(2) şi Γ-(2);
 subgraful obţinut prin eliminarea vârfurilor 4 şi 5.
 Matricea de adiacentă a unui graf
orientat G cu n vârfuri, este o matrice
a cu n linii * n coloane, în care fiecare
element a [i][ j] poate avea valoarea:
 1, dacă există arcul (i, j);
 0, în caz contrar.
 Arcul (i,j) nu este totuna cu arcul (j,i),
matricea de adiacentă nu este
simetrică faţă de diagonala principală, 0 1 0 0 1
aşa cum se întâmpla în cazul 0 0 1 0 1
grafurilor neorientate. 0 0 0 1 0
 Pentru graful din figură, matricea de 0 0 0 0 1
adiacentă, cu 5 linii * 5 coloane este: 0 0 0 0 0
 Prin definiţie, pentru un nod oarecare x, Γ+(x)
reprezintă mulţimea nodurilor ce constituie
extremităţi finale ale arcelor care pleacă din nodul x.
Întrucât din nodul 2 pleacă arcele (2,3) şi (2,5), rezultă
că Γ+(x)={3,5}.
 Pentru un nod x, ω-(x) reprezintă mulţimea arcelor
care intră în nodul x. Deci ω-(2)={ (1,2)}, deoarece în
nodul 2 intră doar arcul (1,2).
 Subgraful obţinut prin eliminarea nodurilor 4 şi 5 este
cel din figura alăturată.
 S-au eliminat nodurile 4 şi 5, precum şi toate arcele
care trec prin aceste noduri.
5
1
Aplicație
 Pentru graful orientat G=(X,U) din
figură, se cere: 4 2
 să se determine numărul vârfurilor
pentru care gradul interior este
strict mai mare decât gradul
exterior; 3
 să se elimine un arc ales astfel încât,
după eliminare,
mulţimea nodurilor x= {1,2,3,4,5} să
poată fi partiţionată
în două mulţimi A şi B disjuncte
(AB=X şi AB=), cu
proprietatea că orice arc al grafului
să aibă o extremitate în mulţimea A
şi cealaltă extremitate în mulţimea
B.
 Rezolvare 5
 Vom scrie gradele interioare şi gradele 1
exterioare ale tuturor nodurilor.
 Prin definiţie, pentru un nod oarecare
xX, gradul exterior (notat d+(x))
reprezintă numărul arcelor care ies din 4 2
nodul x, iar gradul interior (notat d-(x))
este dat de numărul arcelor care intră în
nodul x.
3
 Avem:
 d+(1)=1, d+(2)=1, d+(3)=1, d+(4)=1, d+(5)=2
 d-(1)=2, d-(2)=1, d-(3)=1, d-(4)=1, d-(5)=1
 Observăm că avem un singur nod pentru
care gradul interior d este strict mai
mare decât gradul exterior d+, şi anume
nodul 1.
 Pentru a doua cerinţă din enunţ, vom construi pas cu
pas mulţimile A şi B, luând fiecare arc şi încercând să
plasăm o extremitate a sa în A şi cealaltă extremitate în
B.
 existenţa arcului (4,5), presupune introducerea nodul 4
în mulţimea A şi vârful 5 în mulţimea B; deci momentan
A={ 4, ... } şi B={ 5, ...}; 5
 pentru arcul (4,3): deoarece nodul 4 se află deja în A, e
1
clar că pe 3 nu-l putem introduce decât în B, deci acum
A={ 4, ...} şi B={ 5,3,...};
 arcul (1,5) ne obligă să introducem nodul 1 în mulţimea
A, întrucât nodul 5 există deja în B, rezultând A={4,1,..} şi 4 2
B={5,3,...);
 Arcul (1,2) determină introducerea nodului 2 în
mulţimea B, pentru că nodul 1 există deja în A; avem A={ 3
4,1,...} şi B={5,3,2, ...};
 arcul (3,1) are deja ambele extremităţi introduse corect,
nodul 1 în mulţimea A şi nodul 3 în mulţimea B;
 a rămas arcul (2,5); ambele extremităţi ale sale se găsesc
deja în mulţimea B. Prin urmare, pentru a se păstra
proprietatea cerută în enunţ, arcul (2,5) trebuie eliminat.
Fişa 5
Citirea matricii de adiacentă de la
tastatură
 Scrieţi un program care citeşte de la tastatură matricea
de adiacentă a unui graf orientat G= (X,U) cu n vârfuri,
apoi afişează muchiile grafului sub forma unor perechi
de forma (x,y), fiecare astfel de pereche desemnând un
arc care pleacă de la nodul x la nodul y.
 Prin citirea matricea de adiacentă de la tastatură,
putem memora arcele existente între nodurile unui
graf.
 În cazul grafurilor neorientate, citeam doar
"porţiunea" (deasupra diagonalei principale în
matrice, deoarece matricea era simetrică. Acum
trebuie să citim toate elementele matricii.
 Algoritmul este cel "clasic" de citire a unui tablou
bidimensional, cu o particularitate, aceea că
elementele nu pot fi decât 0 sau 1.
 În două cicluri, parcurgem liniile i şi coloanele j ale
matricii (i=1,2,... ,n şi j =1,2,... ,n), şi la fiecare pas facem
citirea elementului a [i][j], cu validarea acestuia:
execută (reia) citirea lui a [i][j], cât timp ea introdusă
nu este 0 sau 1.
cout<<"dati numarul de noduri:";
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cout<<"dati elementul "<<"a["<<i<<","<<j<<"]=";
cin>>a[i][j];
while((a[i][j]!=0) and (a[i][j]!=1))
{
cout<<"dati elementul "<<"a["<<i<<","<<j<<"]=";
cin>>a[i][j];
}
}
#include<iostream.h> for(i=1;i<=n;i++)
int main(void) {
{ for(j=1;j<=n;j++)
int a[20][20]; cout<<a[i][j]<<" ";
int n,i,j; cout<<endl;
cout<<"dati numarul de noduri:"; }
cin>>n; for(i=1;i<=n;i++)
for(i=1;i<=n;i++) for(j=1;j<=n;j++)
for(j=1;j<=n;j++) if(a[i][j]!=0)
{ cout<<"muchia
cout<<"dati elementul ("<<i<<","<<j<<")"<<endl;
"<<"a["<<i<<","<<j<<"]="; }
cin>>a[i][j];
while((a[i][j]!=0) and
(a[i][j]!=1))
{
cout<<"dati elementul
"<<"a["<<i<<","<<j<<"]=";
cin>>a[i][j];
}
}
 Afişarea matricii de adiacentă se face într-un ciclu,
parcurgând liniile i=1,2,..., n, şi la fiecare pas la fiecare
pas afişăm elementele liniei i (într-un alt ciclu în care
parcurgem coloanele j=1,2,..., n ale liniei i), apoi
mutăm cursorul la începutul rândului următor pe
ecran.

for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
 Pentru tipărirea arcelor grafului prin "citirea" lor din
matricea de adiacentă, tot în două cicluri for, parcurgem
liniile i=1, 2,…, n și coloanele j=1,2,... ,n ale matricii; la
fiecare pas, dacă elementul a[i][j] este 1, înseamnă că
există arcul (i,j), deci afişăm extremităţile acestuia, pe
un rând de ecran.

for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]!=0)
cout<<"muchia ("<<i<<","<<j<<")"<<endl;
Citirea matricii de adiacentă dintr-
un fişier text
 Realizaţi o procedură care citeşte matricea de
adiacenta a unui graf orientat din fişierul "[Link]".
Fişierul conţine:
 pe primul rând un întreg n reprezentând numărul de
vârfuri ale unui graf orientat;
 pe fiecare din următoarele n rânduri câte n valori de 0
sau 1 separate prin spaţii, reprezentând elementele unei
linii a matricii de adiacentă aferente grafului.
 Este vorba despre algoritmul de citire a unei matrici
oarecare dintr-un fişier text.
 Plecăm de la presupunerea că fişierul conţine pe
primul rând valoarea lui n apoi, pe fiecare din
următoarele n rânduri elementele unei linii a matricii
separate prin spaţii.
for(i=1;i<=n;i++)
#include<fstream.h>
{
#include<iostream.h>
for(j=1;j<=n;j++)
int main(void)
cout<<a[i][j]<<" ";
{
cout<<endl;
int a[20][20],n,i,j;
}
ifstream f("[Link]");
cout<<"muchiile grafului sunt:"<<endl;
f>>n;
for(i=1;i<=n;i++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
for(j=1;j<=n;j++)
if(a[i][j]==1)
f>>a[i][j];
[Link](); cout<<"("<<i<<","<<j<<")"<<endl;
}
Construirea matricii de adiacentă prin
citirea muchiilor de la tastatură
 Se citesc de la tastatură doi întregi m şi n reprezentând
numărul de muchii respectiv vârfuri ale unui graf
orientat, apoi m perechi de numere întregi de forma
(x,y), reprezentând extremităţile celor m muchii din
graf. Să se construiască matricea de adiacentă a, cu n
linii și n coloane, apoi să se afişeze această matrice.
 Mai întâi citim m şi n (numărul de arce respectiv numărul
de noduri) şi iniţializăm toată matricea de adiacentă cu 0
(zero), în două cicluri for.
 Apoi, într-un alt ciclu for, cu k de la 1 la m, citim cele m
perechi de întregi (x ,y).
 Citirea fiecărei perechi (x, y) se face cu validare: execută
citirea lui x şi y cât timp una din valorile introduse se
situează în afara intervalului [1,n] adică (x<1 SAU x>n
SAU y<1 SAU y>n)
 Pentru fiecare pereche (x,y), marcăm în matricea de
adiacentă existenţa 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).
#include<iostream.h> while(x<1 || x>n || y<1 || y>n);
int main(void) a[x][y]=1;
{ }
int a[20][20],i,j,m,n,k,x,y;
cout<<"dati numarul de noduri:"; for(i=1;i<=n;i++)
cin>>n; {
cout<<"dati numarul de muchii:"; for(j=1;j<=n;j++)
cin>>m; cout<<a[i][j]<<" ";
for(i=1;i<=n;i++) cout<<endl;
for(j=1;j<=n;j++) }
a[i][j]=0; }
for(k=1;k<=m;k++)
{
cout<<"dati muchia cu numarul de
ordine "<<k<<":"<<endl;
do
{
cout<<"x=";
cin>>x;
cout<<"y=";
cin>>y;
}
Determinarea gradului exterior si
a gradului interior
 Fie un graf neorientat cu n vârfuri, pentru care se
cunoaşte matricea de adiacenţă. Scrieţi un program
care returnează gradul exterior d+(x) şi gradul interior
d-(x) al unui vârf x transmis ca parametru.
 Gradul exterior al unui nod x este numărul arcelor care
ies din nodul x, adică al arcelor de forma (x, j), cu
j{1,2,... ,n}.
 Luăm ca exemplu graful cu n=4 noduri, împreună cu
matricea sa de adiacentă:
2 3

coloana 1 2 3 4
0 0 0 01
1 0 1 12
A= 0 0 0 13 1 4
0 1 0 04
 Analizăm gradul exterior al nodului 2. Arcele care ies din
nodul 2 sunt: (2,1), (2,3), (2,4). Urmare a existenţei acestor
arce, în matricea de adiacentă a[2][1]=a[2][3]=a[2][4]=1.
 În matricea de adiacentă toate valorile de 1 corespunzătoare
arcelor ce ies din nodul 2 se găsesc pe linia 2.
 Pentru cazul general, valorile de 1 de pe linia x în matricea
de adiacentă, reprezintă arcele care ies din x. Deci gradul
exterior al nodului x, adică numărul arcelor care ies din
nodul x, este egal cu numărul valorilor de 1 de pe linia x a
matricii.
 Iniţializăm cu 0 variabila nr în care numărăm valorile de 1
de pe linia x a matricii. Parcurgem coloanele j ale liniei x,
într-un ciclu cu j=1,2,...,n. Pentru fiecare valoare a lui j.
testăm elementul a[x][j], situat pe linia x şi coloana j.
 Dacă acesta are valoarea 1, atunci incrementăm variabila
nr.
 Programul va returna valoarea finală a variabilei nr.
#include<iostream.h>
#include<fstream.h>
int main(void)
{
int a[10][10],n,i,j,nr=0,x;
ifstream f("[Link]");
f>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>a[i][j];
[Link]();
cout<<"dati nodul:";
cin>>x;
for(j=1;j<=n;j++)
if(a[x][j]==1)
nr++;
cout<<"gradul exterior al nodului "<<x<<" este "<<nr;
}
 Destul de asemănător este şi
algoritmul pentru determinarea 2 3
gradului interior al nodului x (d-(x)).
 Acesta reprezintă numărul arcelor care
intră în nodul x, adică numărul arcelor
de forma (i,x), cu i{1,2,... ,n}.
 Să luăm ca exemplu nodul x=4 pentru
graful anterior Arcele care intră în 1 4
nodul 4 sunt (3,4) şi (2,4). Rezultă că coloana 1 2 3 4 linia
în matricea de adiacenţi avem
a[3][4]=a[2][4]=1. Am "reperat" astfel 0 0 0 01
valorile de 1 de pe coloana 4 a matricii 1 0 1 12
de adiacentă. A= 0 0 0 13
 Gradul interior al unui nod oarecare
reprezintă numărul valorilor de 1 de pe 0 1 0 04
coloana x a matricii. Programul va
returna câte valori de 1 se găsesc pe
coloana x.
#include<iostream.h>
#include<fstream.h>
int main(void)
{
int a[10][10],n,i,j,nr=0,x;
ifstream f("[Link]");
f>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>a[i][j];
[Link]();
cout<<"dati nodul:";
cin>>x;
for(i=1;i<=n;i++)
if(a[i][x]==1)
nr++;
cout<<"gradul interior al nodului "<<x<<" este "<<nr;
}
Drumuri şi circuite în grafuri
orientate
 Se numeşte lanţ într-un graf orientat, o
mulţime de arce L={u1,u2, ... ,uk}, cu
proprietatea că oricare două arce vecine în
mulţime au o extremitate comună.
 În graful din figura alăturată, un
lanţ ce are ca extremităţi nodurile
3 şi 1 este L1={u5,u3,u1}
 Lanţul L2={u2, u3,u5,u6} este un
lanţ ce are ca extremităţi nodurile
3 şi 1.
 Un lanţ este de fapt un traseu care
uneşte prin arce două noduri
numite extremităţile lanţului, fără
a ţine cont de orientarea arcelor
componente.
 Definiţiile noţiunilor de drum şi circuit elementar/ne-
elementar), sunt similare cu cele ale noţiunilor de lanţ
şi ciclu de la grafuri neorientate.
 Definiţie: Se numeşte drum în graful G, un şir de
noduri D=[z1,z2,... ,zk], unde z1,z2,... ,zk  X, cu
proprietatea că oricare două noduri consecutive
sunt adiacente, adică există arcele [z1,z2], [z2,z3],.. .,
[zk…,zk] U.
 Un drum poate fi privit ca un traseu în care toate arcele
au aceeaşi orientare, dată de sensul de deplasare de la
z1 la zk.
 Dacă nodurile z1, z2,..., zk sunt distincte două câte
două, drumul se numeşte elementar. În caz
contrar, drumul este ne-elementar.
 În graful din figura alăturată
secvenţele D1=(3,4,3,2,1) şi D2=(3,4,2,1)
sunt drumuri.
 Drumul D1 nu este elementar,
deoarece trece de două ori prin nodul
3 (parcurgând arcele u5, u2 şi u1 în
această ordine).
 În schimb drumul D2 este elementar.
 Asemeni unui lanţ într-un graf neorientat, un drum
într-un graf orientat este de fapt un traseu pe care l-am
parcurge între două noduri deplasându-ne de-a lungul
unor arce şi trecând prin nişte noduri intermediare.
 Deosebirea unui drum faţă de lanţ constă în faptul că
de-a lungul unui arc ne putem deplasa numai în sensul
dat de orientarea arcului.
 Definiţie: Se numeşte circuit într-un graf, un lanţ
L=[z1,z2,... ,zk] cu proprietatea că z1=zk şi arcele
[z1,z2],[z2,z3] ,..., [zk-1,zk] sunt distincte două câte
două.
 Dacă într-un circuit, toate nodurile cu excepţia
primului şi a ultimului sunt distincte două câte
două, atunci circuitul se numeşte elementar. În
caz contrar, el este ne-elementar.
Exemplu:
 În graful din figura alăturată,
secvenţele
C1=(4,3,2,1,3,5,6,4),
C2=(3,5,6,4,3) şi 4
C3= (1,3,2,1)
sunt circuite. Dintre acestea, C1
este ne­elementar deoarece nodul
3 apare de două ori, iar C2 şi C3
sunt elementare.

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