Sunteți pe pagina 1din 18

9.4.

Arbori
9.4.1. Definiie

Se numete arbore un graf conex, care nu conine cicluri.

Proprietate: Orice arbore cu n noduri, are n-1 muchii.


Demonstratie:
Demonstrarea proprietii se face prin inducie matematica.
Pentru n=1 numarul muchiilor este 0, se verifica.
Pentru n=2 numarul muchiilor este 1, se verifica.
..
Presupunem proprietatea adevarata pentru un arbore cu n noduri, care vor avea n-1
muchii.
Fie un arbore cu n+1 muchii. Acest arbore contine cel putin un nod terminal, in caz
contrar, ar contine un ciclu, ceea ce contrazice ipoteza.
Daca eleminam acest nod terminal si muchia incidenta lui, obtinem un arbore cu n
noduri pentru care am presus proprietatea adevarata, prin urmare are n-1 muchii.
Rezulta ca arborele cu n+1 muchii are n-1+1 muchii.
Fie G=(X,U) un graf neorientat.
Ne punem problema s verificm dac un graf ndeplinete cele dou condiii
pentru a fi arbore.
1. Verificarea conexitii.
n paragraful 9.3. am descris algoritmul de verificare a unui graf dac este
conex parcurgnd graful de exemplu n adncime i marcnd nodurile vizitate. Dac
n final toate nodurile au fost vizitate, graful este conex.
2. Cum verificm dac are cicluri?
i aceast problem se poate rezolva tot parcurgnd graful i verificnd dac
ajungem la un nod deja vizitat.
Apare totui o problem i anume faptul c muchia [i,j] are semnificaia unei
legturi de la i la j i de la j la i. Aceasta creaz aparent un ciclu {i,j,i}. Prin urmare
trebuie s gsim o metod prin care, dac parcurgem muchia de la i la j, s evitm
parcurgerea muchiei i de la j la i.
Soluia ar fi, ca n momentul parcurgerii unei muchii, s anulm muchia
simetric din matricea de adiacen.

#include<fstream.h>
#include<iostream.h>
#define MAX 10
void citire();
void adancime(int nod);

//VERIFICAREA UNUI GRAF DACA ESTE ARBORE

int a[MAX][MAX], n, s[MAX], gasit; // a-matricea de adiacenta, n-nr.noduri


//s-vector caracteristic
//gasit-semnaleaza gasirea unui ciclu
void main()
{int i;
citire();
afisare();
adancime(1);
for(i=1;i<=n;i++)
if(!s[i])
{cout<<"Graful nu este conex\n";break;}
if(gasit)
{cout<<"Graful are cel putin un ciclu";}
else
{cout<<"Graful este un arbore";}
getch();
}
void citire()
{int x,y;
ifstream f("d:\\sanda\\c++\\probleme\\cpp\\grafuri\\graf.in");
f>>n;
while(!f.eof())
{f>>x>>y;
a[x][y]=1;
a[y][x]=1;
}
}
void afisare()
{int i,j;
cout<<"Matricea de adiacenta:"<<endl;
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}
void adancime(int nod)
{int i;
s[nod]=1;
for(i=1;i<=n;i++)
if (a[nod][i]) //verifica daca exista muchie
{a[i][nod]=0; //anuleaza memorarea muchiei [i,nod]
if(!s[i]) adancime(i);
else
gasit=1;
}
}

9.4.2. Reprezentarea arborilor n memorie


ntruct arborele este un graf, poate fi reprezentat n memorie cu ajutorul
matricei de aiacen i cu ajutorul listelor de adiacen.
Pe lng aceste modaliti de reprezentare, mai exist o metod specific
arborilor i anume cu ajutorul legaturii de tip TAT.
ntr-un vector t cu n componente (n-numrul de noduri), pe poziia i a
vectorului reinem tatl nodului i. Nodul care nu are tat, l vom numi nod rdcin i
va avea t[i]=0.
Exemplu:
3
1

vectorul t
4

3
1

3
2

0
3

1
4

3
5

8
6

5
7

5
8

2
9

Nodul 3 este tata pentru nodurile 1, 2 i 5, nodul 1 este tat pentru nodul 4, nodul 2
este tat pentru nodul 9, nodul 5 este tat pentru nodurile 7 i 8 iar nodul 8 este
tata pentru nodul 6.
9.4.3. Arbore parial

Fie G=(X,U) un graf neorientat i conex.


Prin eliminarea unor muchii se obine un graf parial al lui G. Dac acest graf
este un arbore, l vom numi arbore parial.

Fie G=(X,U) un graf neorientat i conex, cu n noduri, dat prin lista muchiilor.
Ne punem problema determinrii unui arbore parial pentru acest graf.
Vom considera pentru nceput graful neorientat G, fr nici o muchie, adic
un graf cu n noduri izolate i prin urmare cu n componente conexe. Memorm acest
lucru ntr-un vector s, adic vectorul s va avea s[i]=i cu i=1,n.

Vom selecta pe rnd toate muchiile grafului i vom reine ca fcnd parte din
arborele parial doar acele muchii,care nu formeaz un ciclu.
1. Selectm o muchie din lista muchiilor.
2. Verificm dac cele dou extremiti ale ei se afl n componente conexe
diferite.
dac da vom reine acea muchie ca fcnd parte din arborele
parial i vom unifica cele dou componente conexe din care fac
parte extremitile muchiei.
dac cele dou extremiti ale muchiei se afl n aceeai
component conex, nu vom reine acea muchie, deaoarece ea va
nchide un ciclu.
3. relum algoritmul de la pasul 1 pn cnd terminm de verificat toate
muchiile.
Exemplu
Fie G=(X,U), cu X={ 1, 2, 3, 4, 5 } i U={ [1,2], [1,3], [3,2], [3,4], [3 5] }
s

muchiile: [1,2], [1,3], [3,2], [3,4], [3 5]


selectm [1,2]
s[1]s[2]
unificm componentele conexe 1 i 2
[1,2]-aparine arborelui parial

1
1

2
2

3
3

4
4

5
5

1
1

1
2

3
3

4
4

5
5

selectm [1,3]
s[1]s[3]
unificm componentele conexe 1 i 3
[1,3]-aparine arborelui parial

1
1

1
2

1
3

4
4

5
5

selectm [3,2]
s[3]=s[2]
[3,2]-NU aparine arborelui parial

1
1

1
2

1
3

4
4

5
5

selectm [3,4]
s[3]s[4]
unificm componentele conexe 1 i 4
[3,4]-aparine arborelui parial

1
1

1
2

1
3

1
4

5
5

selectm [3,5]
s[3]s[5]
unificm componentele conexe 1 i 5
[3,5]-aparine arborelui parial

1
1

1
2

1
3

1
4

1
5

arborele parial conine muchiile:


[1,2], [1,3], [3,4], [3,5]

Adesea aplicaiile practice pe care trebuie s le rezolvm conin pentru


fiecare muchie a grafului un anumit cost (de exemplu costul necesar strbaterii
muchiei respective sau lungimea muchiei).
n aceste conditii apare i o cerin suplimentar i anume determinarea
arborelui parial de cost minim.
Pentru determinarea arborelui parial de cost minim, vom memora muchiile
grafului mpreun cu costurile lor ntr-o structur de forma:
struct nod
{ int x,y;
float cost;
};
Ordonm apoi lista muchiilor n ordinea cresctoare a costurilor i vom
parcuge lista ncepnd cu muchiile cu costul cel mai mic, astfel ne vom asigura c
obinem n final arboreal parial de cost minim.

#include <iostream.h>
#include <fstream.h>
#define MAX 20

//ARBORE PARTIAL

struct nod

//reine muchiile

{ int x,y; };

int s[MAX],n,m;
nod u[MAX];
void citire()
{int x,y;
int i=0;
ifstream f("graf.in");
f>>n;
while(!f.eof())
{f>>x>>y;
if(!f.eof())
u[i].x=x;u[i].y=y;
i++;
}
m=i-1;
f.close();
}

//citete graful i creaza lista muchiilor

void apm()
//determina arborele partial
{ int i,k=1,aux1,aux2;
for(i=0;i<n;i++)
//considera graful cu toate nodurile izolate
s[i]=i;
i=0;
while(k<=n-1)
//arborele trebuie sa aiba n-1 muchii
{if(s[u[i].x]!=s[u[i].y]) //verifica daca cele doua extremitati ale muchiei i
{
//se afla in componente conexe diferite
k++;
//creste numarul muchiilor selectat
aux1=s[u[i].x]; aux2=s[u[i].y];
for(int j=1;j<=n;j++) //unifica cele doua componente conexe
if(s[j]==aux2)
s[j]=aux1;
cout<<"Muchia: "<<u[i].x<<" "<<u[i].y<<endl;
}
i++;
}
}
void main()
{citire();
apm();
}

9.5.4 Evaluare
TESTUL 1
1. Definii noiunea de arbore parial?
2. Cte muchii are un arbore cu n noduri?
3. Fie graful G=(X,U) dat prin matricea de adiacen:
0 1 0 1 0 1 1
1 0 1 1 0 1 1
0 10 0 1 1 1
1 1 0 0 1 0 1
0 0 1 1 0 0 0
0 1 1 10 0 0
1 1 1 1 1 0 0
a.) S se reprezinte grafic.
b.) Determinai lista muchiilor.
c.) Determinai un arbore parial
d.) Reprezentai arborele obinut cu ajutorul vectorilor de tai.
TESTUL 2
1. Se citete un graf G=(X,U). S se verifice dac este arbore.
2. n jude localitile sunt legate ntre ele prin mai multe osele. ntruct
oselele s-au deteriorat, trebuie reparate.
Totui circulaia ntre localiti nu poate fi ntrerupt, din acest motiv trebuie
stabilite care osele nu vor intra n reparaie, astfel nct s se repare ct mai
multe osele, dar s nu rmn nici o localitate izolat.
Scriei un program care s rezolve aceast problem.
6

9.5. Grafuri orientate


9.5.1. Definiii
S ne imaginm un ora vechi cu mai multe piee i cu strzi foarte nguste,
pe care nu se poate circula n ambele sensuri. Din acest motiv s-a stabilit un sens
unic de circulaie pe strzile oraului. Un astfel de ora poate fi modelat matematic
ca un graf orientat, deoarece pe strzile lui se poate circula ntr-un singur sens.
Reprezentarea schematic a unui graf orientat:
1

3
5
4
figura 3

Numim graf orientat o pereche ordonat de mulimi (X, U), Unde X este o
mulime finit i nevid de elemente numite vrfuri (noduri), iar U o mulime de
perechi ordonate de elemente distincte din X, numite arce.
Notm un graf orientat cu G=(X,U).
X={x1, x2, x3,... xn} reprezint mulimea vrfurilor grafului G.
U XxX este mulimea arcelor grafului G.
Un element u U se numete arc, l notm cu [xi ,xk], unde xi ,xk X.
Observaie: arcul [xi ,xk] este diferit de arcul [xk ,xi], ele au orientri diferite.
n definiiile i exemplele care urmeaz nu vom lua n considerare arce u de forma
[xi ,xi], vom numi aceste grafuri fr bucle.
Pentru exemplul din figura 3 avem:
X={1, 2, 3, 4, 5,} este mulimea vrfurilor
U={ [1,2], [1,5], [2,3], [3,4] ,[4,5], [5,3] } este mulimea arcelor

Vom spune c arcul u= [x i ,xk ] are extremitile xi respectiv xk iar


nodurile xi , xk sunt adiacente n G.
Arcul u l numim incident cu vrfurile xi , xk.

Noiunile de graf parial i subgraf se definesc ca i n cazul grafurilor


neorientate.
Prin urmare dintr-un gtaf se obine un graf parial prin eliminarea a unuia sau
mai multor arce.
Dintr-un graf se obine un subgraf prin eliminarea unuia sau mai multor vrfuri
mpreun cu arcele corespunztoare lui.

Fie graful neorientat G=(X,U).


Numim grad exterior al vrfului xi i notm cu d+(xi), numrul arcelor de forma
[xi ,xk ] (au ca extremitate iniial vrful xi).
Numim grad interior al vrfului xi i notm cu d-(xi), numrul arcelor de forma
[xk ,xi ] (au ca extremitate final vrful xi).
Numim vrf izolat, un vrf carea are d+(xi)= d-(xi)=0 (zero).
Numim nod terminal, un nod careare gradul 1.
Noiunea de lan se definete ca i la grafurile neorientate (nu inem seama de
orientarea arcelor).

Fie graful neorientat G=(X,U).


Numim drum i notm D={xi1 ,x i2 ,x
proprietatea c [x i ,x i+1] X , 1<=i<k.

i3

,....,x ik}, o succesiune de vrfuri cu

xi1 ,x ik -se numesc extremitile drunului


Lungimea unui drum=numrul de arce din care este format.
Numim drum simplu un drum care conine numai arce distincte.
Numim drum compus un drum care nu este format numai din arce distincte.
Numim drum elementar un drum care conine numai vrfuri distincte.
Numim cicuit un drum n care primul vrf coincide cu ultimul.
Circuitul este elementar dac este format doar din vrfuri distincte, excepie
fcnd primul i ultimul vrf.
Numim bucl un circuit fornat dintr-un singur arc.
Exemple:
Fie graful G=(X,U), unde X={ 1, 2, 3, 4, 5, 6 } iar U={ [1,6], [2,1], [2,4], [5,4], [5,6],
[6,2] }
Reprezentaea grafului:
1
6

3
4

Exemplu de nod izolat:


Gradele nodurilor:
d+(1)=1
d-(1)=1
d+(2)=2
d-(2)=1
+
d (3)=0
d-(3)=0
+
d (4)=0
d-(4)=2
d+(5)=2
d-(5)=0
+
d (6)=1
d-(6)=2

nodul 3

-are d+(3)= d-(3)=0

Exemplu de drum elementar:


Exemplu de drum neelementar:
Eemple de drum simple:
Exempl de drum compus:

D1={ 1, 6, 2, 4 }
D2={ 1, 6, 2, 1, 6, 2, 4 }
D3={ 5, 6, 2, 4 }
D6={ 1, 6, 2, 1, 6, 2, 4 }

de lungime l1=3
de lungime l2=6
de lungimel3=3
de lungime l4=6

Exemplu de circuit elementar:

C1={ 1, 6, 2, 1 }

de lingime l5=3

9.5.2. Reprezentarea i parcurgerea grafurilor orientate


1. Reprezentarea grafurilor orientate n memorie
Memorarea grafurilor orientate se realizeaz ca i n cazul grafurilor
neorientate, cu ajutorul matricei de adiacen, a listelor de adiacen i a listei
arcelor.
La memorerea grafurilor orientate se ine seama de orientarea arcelor, astfel
matricea de adiacen nu va fi simetric.
Exemplu de reprezentare a grafurilor orientate cu ajutorul matricei de
adiacen.
Vom prezenta doar funcia de citire i creare a matricei de adiacent.

void citire(int &n, int a[MAX][MAX])


//MATRICE DE ADIACENTA
{int x,y,i,m;
//PENTRU GRAFURI ORIENTATE
cout<<"n=";cin>>n;
// n-nr. varfuri
cout<<"m=";cin>>m;
// m-nr.arce
for(i=1;i<=m;i++)
{cout<<"muchia "<<i<<":";
cin>>x>>y;
a[x][y]=1;
// doar pozitia a[x][y] ia valoarea 1 in matrice
}
}

Memorarea grafurilor cu liste de adiacen sau cu ajutorul listei arcelor nu se


deosebete cu nimic de cea a grafurilor neorientate.

2. Parcurgerea grafurilor orientate


Grafurile orientate se parcurg n lime sau n adncime la fel ca i grafurile
neorientate. Implenentarea acestor algoritmi nu se deosebete cu nimic de cea a
grafurilor neorientate.
3. Determinarea matricei drumurilor din matricea de adiacen
Fiind dat un graf orientat G=(X,U), cu n vrfuri, memorat cu ajutorul matricei
de adiacen, dorim s tim dac exist drum ntre oricare dou vrfuri x, y din X.

Definim matricea drumurilor asociat grafului orientat G=(X,U) i o


notm cu B, ca fiind matricea patratic de dimensiune nxn, cu elemente de
forma
1
dac ntre vrfurile i i j exist drum
Bi, j= {
0

dac ntre vrfurile i i j NU exist drum

S facem urmtoarea observaie: este posibil ca ntre dou vrfuri din graf s
nu existe arc, dar exist un drum ntre cele dou vrfuri, ca n exemplul de mai jos.

ntre vrful i i vrful j nu exist arc, dar exist drumul {i, k, j }. Cu alte
cuvinte n matricea de adiacen avem a[i,j]=0 dar a[i,k]=1 i a[k,j]=1.
Algoritmul Roys-Warshall , construiete matricea drumurilor din matricea de
adiacen astfel:
un element a[i,j]=0 devine 1, dac exist k astfel nct a[i,k]=1 i a[k,j]=1.

void r_w()
//MATRICEA DRUMURILOR
{int k,i,j;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if (!a[i][j])
a[i][j]=a[i][k]*a[k][j];
}
10

9.5.3. Conexitate i tareconexitate


1. Definiii i exemple

Un graf orientat G=(X,U) se numete conex, dac pentru oricare


dou vrfuri xi, xk, xi xk din X, exist un lan de la xi la xk .

Un graf orientat G=(X,U) se numete tare conex, dac pentru oricare


dou vrfuri xi, xk, xi xk din X, exist un drum de la xi la xk i de la. xk la xi.

Se numete component tare conex a grafului orientat G=(X,U), un


subgraf H=(Y,V) dac
1. oricare ar fi yi, yk, din Y, exist drum de la yi la yk i de la yk la yi;
2. nu exist un alt subgraf H1=(Y1,V1) cu H Y1 care ndeplinete
condiia 1.

Exemple
1. Fie graful orientate G=(X,U) cu X={ 1, 2, 3, 4, 5 } i U={ [1,2], [2,3], [3,1], [4,5],
[5,4], [4,1], [1,4]}. S se reprezinte grafic. Spunei dac este tare conex sau nu.
Parcurgei graful n lime i n adncime pornind din nodul 5.
Reprezentarea grafic
1
2

4
5
3

Graful din exemplu este tare conex, deoarece oricare ar fi x,y X exist drum de la
x la y i de la y la x.
11

Parcurgerea n lime: 5 4 1 2 3
Parcurgerea n adncime: 5 4 1 2 3
2. Fie graful orientate G=(X,U) cu X={ 1, 2, 3, 4, 5 } i U={ [1,2], [2,3], [3,1], [1,4],
[4,5], [5,4]}
a.) S se reprezinte grafic
b.) Construii matricea de adiacen
c.) Este graful conex? De ce?
d.) Este graful tare conex? De ce?
e.) Dac nu este tare conex, s se determine componentele tare conexe.
f.) parcurgei graful n lime i n adncime pornind din nodul 1.
a. ) Reprezentarea grafic
1
2

4
5
3

b.) matricea de adiacen:


01010
00100
10000
00001
00010
c.) Graful este conex deoarece exist lan ntre oricare dou vrfuri.
d.) Graful nu este tare conx, deoarece nu exist drum de exemplu ntre vrfurile 5 i
2.
e.) Graful are dou componente tareconexe:
componenta 1: { 1, 2, 3 }
componenta 2: { 4, 5 }
f.) parcurgerea n lime: 1 2 4 3 5
parcurgerea n adncime: 1, 2, 3, 4, 5
2. Determinarea componentelor tare conexe
Pentru determinarea componentelor tare conexe vom realiza un algoritm
asemanator cu algoritmul de determinare a componentelor conexe.
Astfel:
1. Construim matricea drumurilor din matricea de adiacen.

12

2. Utilizm un vector s, n care vom memora n casua i, numrul componentei tare


conexe creia i aparine i.
3. Cutm n s, primul element nemarcat.
4. Dac gasim un element nemarcat, cretem numrul componentei tare conexe i
l reinem n variabila nod.
5. Parcurgem linia corespunztoare lui nod i pentru fiecare element i de pe linia
nod, verificm dac ntre nod i elementul i i ntre i i nod exist drumuri, atunci
marcm poziia i din s cu numrul componentei tare conexe. Relum algoritmul
de la pasul 3.
6. Daca nu mai gsim elemente nemarcate algoritmul se termin.
Exemplu:
Pentru graful orientate G=(X,U) cu X={ 1, 2, 3, 4, 5 } i U={ [1,2], [2,3], [3,1], [4,5],
[5,4], [1,4]}
1
2

4
5
3

obinem:
Matricea de adiacenta:
01000
00110
10000
00001
00010
Matricea drumurilor:
11111
11111
11111
00011
00011
Vectorul s:
1 1 1 0 0 -dup marcarea primei componente tare conexe
1 1 1 2 2 - dup marcarea celei de a doua componente tare conexe
componenta 1: 1, 2, 3
componenta 2: 4, 5

13

#include<fstream.h>
#include<iostream.h>
#define MAX 10

//COMPONENTE TARE CONEXE

void citire();
void afisare();
void r_w();
void tare_conex(int nod);
void afis_comp();
int a[MAX][MAX],n,s[MAX],p;

// a-matricea de adiacenta, n-nr.noduri


//s-vector caracteristic, p-nr.componente tare conexe

void main()
{int i;
citire(n,a);
//citeste graful
cout<<"Matricea de adiacenta:"<<endl;
afisare(n,a);
r_w();
//construieste matricea drumurilor
cout<<"Matricea drumurilor:"<<endl;
afisare(n,a);
for(i=1;i<=n;i++)
//parcurge vectorul s
if(!s[i])
//daca gaseste elemente nemarcate
{p++;
//creste nr. componentei conexe
tare_conex(i);
//determina urmatoarea componenta tare conexa
for(int j=1;j<=n;j++)
cout<<s[j]<<" ";
cout<<endl;
}
afis_comp();
//afiseaza componentele tareconex
}
void citire()
{int x,y,i;
ifstream f("graf.in");
f>>n;
while (!f.eof())
{f>>x>>y;
a[x][y]=1;
}
f.close();
}

//citeste graful

void afisare()
{int i,j;
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}

//afiseaza graful

14

void r_w()
{int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(!a[i][j])
a[i][j]=a[i][k]*a[k][j];
}

//determina matricea drumurilor

void tare_conex(int nod)


//nod-varful de pornire
{int i,j;
s[nod]=p;
//marcheaza in s numarul componentei conexe
for (i=1;i<=n;i++)
//parcurge linia corespunzatoare nodului de pornire
if(a[nod][i]==1&&a[i][nod]==1)
//daca exista drum intre nod si i si intre i si nod
s[i]=p;
// i face parte din aceeasi componenta tare conexa cu nod
}
void afis_comp()
{int i,j;
for(i=1;i<=p;i++)
{cout<<"componenta "<<i<<":";
for(j=1;j<=n;j++)
if(s[j]==i)
cout<<j<<" ";
cout<<endl;
}
}

//afiseaza componentele tare conexe

15

9.5.4 Evaluare
TESTUL 1
1. Fie graful orientat G=(X,U) dat prin matricea de adiacen:
0010000
1000000
0001000
0100000
0001010
0000100
0000000
a.) S se reprezinte grafic.
b.) Determinai suma gradelor exterioare i interioare pentru nodurile: 1, 4, 5
i 7
c.) Determinai listele de adiacen pentru vrfurile: 1, 4, i 6.
d.) Cte circuite are graful?
e.) Cte noduri izolate are graful?
TESTUL 2
1. Definii noiunea de graf orientat.
2. Fie graful G=(X,U) cu n=5 noduri, X={ 1, 2, 3, 4, 5 } i U={ [1,2], [2,3], [3,4],
[4,5] }
a.) S se reprezinte grafic
b.) Determinai gradele interioare i exterioare ale vrfurilor
c.) Determinai toate drumurile de la vrful 1 la vrful 5.
d.) Determinai un circuit
e.) Scriei matricea de adiacen corespunztoare grafului
3. Scriei un program care s citeasc din fiierul GRAF.IN, n, numrul de vrfuri
i arcele grafului. Parcurgei graful n lime.
4. Scriei un program care s citeasc din fiierul GRAF.IN, n, numrul de vrfuri
i arcele grafului. Construii i afiai matricea drumurilor.
TESTUL 3
1. Definii noiunea de component tare conex.
2. Fie graful G=(X,U) cu n=9 noduri, X={ 1, 2, 3, 4, 5, 6, 7, 8, 9 } i U={ [1,2],
[2,3], [3,4], [4,1], [4,5], [5,6], [6,5], [7,8], [8,9], [9,7], [6,7] }
a.) S se reprezinte grafic
b.) Identificai componentele tare conexe ale grafului.
c.) Adugai un numr minim de arce grafului astfel nct sa devin tare
conex.
3. Scriei un program care s determine toate componentele tare conexe ale
unui graf.
4. Scriei un program care s citeasc din fiierul GRAF.IN, n, numrul de vrfuri
i arcele grafului. Parcurgei graful n adncime.

16

9.6. Probleme propuse


1. Se d un graf neorientat cu 50 de noduri i muchiile [1,10], [20,30], [40,50], cte
noduri izolate are graful?
2. Fie graful neorientat cu vrfurile: 1, 2, 3, 4, 5, 6, 7 i arcel [1,2], [1,3],[1,6], [2,3],
[3,4], [4,1], [5,3], [5,1], [6,5]. S
a.) S se determine matricea de adiacen.
b.) S se determine listele de adiacen ale grafului.
c.) Este un graf complet? De ce?
d.) Cte muchii trebuie s adugai grafului pentru a deveni un graf complet?
3. Fie graful orientat cu vrfurile: 1, 2, 3, 4, 5, 6, 7 i arcel [1,2], [1,3],[1,6], [2,3],
[3,4], [4,1], [5,3], [5,1], [6,5].
a.) Reprezentai graful cu ajutorul vectorului de tai.
b.) S se determine numrul de drumuri elementere de la 1 la 4.
c.) Cte circuite elementare are graful?
d.) Determinai gradul interior al vrfului 3 i gradul exterior al vrfului.
4.

Fiind dat urmatorul vector de tai: 5 1 1 1 0 7 5 12 5 9 10 10, s se determine


arboreal corespunztor lui.

5. Care este numrul maxim de arce pentru un graf cu 8 noduri?


6. Fiind dat un graf neorientat i dou noduri x i y, s se determine toate lanurile
elementare avnd ca extremiti nodurile date.
7. S se testeze dac un graf neorientat, dat prin lista muchiilor, conine cicluri.
8. Fiind dat un graf neorientat, s se verifice dac este bipartit.
9. Fiind dat un graf neorientat, s se determine toate perechile de noduri ntre care
exist cel puin un lan.
10. S se determine ntr-un graf neorientat dat, cel mai lung lan al su.
11. ntr-un laborator de informatic trebuie legate n reea n calculatoare.
Pentru cele n calculatoare se cunosc distnele dintre ele. S se determine o
modalitate de conectare a calculatoarelor astfel nct s se consume ct mai
puin cablu pentru conectarea lor n reea.
11. n jude localitile sunt legate ntre ele prin mai multe osele. Se cunoate
lungimea fiecrei osele. ntruct oselele s-au deteriorat, trebuie reparate.
Totui circulaia ntre localiti nu poate fi ntrerupt, din acest motiv trebuie
stabilite care osele nu vor intra n reparaie, astfel nct s se repare un numar ct
mai mare de kilometrii de osea, dar s nu rmn nici o localitate izolat.
Scriei un program care s rezolve aceast problem.

17

12. ntr-un ora sunt n piee. ntre aceste piee se poate circula doar pe strzi cu
sens unic. Se cere s se verifice dac din oricare pia se poate ajunge n
oricare alt pia. Datele se citesc din fiierul ORAS.IN astfel:
- de pe prima linie se citete n, numrul de piee
- pe liniile urmtoare se gsesc strzile cu sens unic de circulaie (cte una
pe linie), date prin cele dou extremiti n sensul de circulaie.
13.

Dup alegerile prezideniale i parlamentare, N partide politice urmeaz s


poarte negocieri n vederea realizrii unor aliane pe baza orientrilor politice
comune. Astfel se vor contura dou grupri: puterea i opoziia, spre una dintre
acestea orientndu-se n funcie de platforma politic, fiecare din cele N partide.
n urma cinvorbirilor purtate ntre unele (nu neaprat toate) partide politice,
apar adversiti i conflicte de idei, datorit crora ntre aceste partide nu se vor
putea stabili aliane.
Precizai dac pe baza listelor de incompatibiliti politice, cele N partide
politice se pot mpri n cele dou grupri: putere i opoziie, precizai care sunt
partidele ce le-ar putea forma.
(Olimpiada local Timi 2006)

18

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