vineri, 9 mai 2014

Componente conexe a unui graf orientat

Fiind dat un graf orintat, sa se determine componente tare conexa careia ii apartine un varf x citit de la tastatura.

Aspect teoretic
Definitie: Un graf orientat G=(X,U) este tare conex daca pentru oricare x si y exista un drum de la x la y precum si un drum de la y la x.
Definitie: Fiind dat un graf orintat G=(X,U), se numeste componenta tare conexa a lui G, un subgraf G1=(X1,U1), tare conex, si maximal in raport cu aceasta proprietate (pentru orice nod x apartinand lui X-X1, subgraful indus de X1 U {x} nu mai este tare conex)

#include<fstream.h>
int a[20][20],n,m,suc[100],prec[100],x; 
void dfsuc(int nod)
{suc[nod]=x;
 for(int k=1;k<=n;k++)
      if(a[nod][k]==1&&suc[k]==0)
               dfsuc(k);
 } 
void dfprec(int nod)
{ prec[nod]=x;
 for(int k=1;k<=n;k++)
      if(a[k][nod]==1&&prec[k]==0)
               dfprec(k);
void main()
{int y,j;
fstream f;
 f.open("comptare.in",ios::in);
 if(f)
   cout<<"bine"<<endl;
 else
   cout<<"eroare !";
 f>>n>>m;
 for(int i=1;i<=m;i++)
    {f>>x>>y;
     a[x][y]=1;}
cout<<endl<<"matricea de adiacenta"<<endl;
for(i=1;i<=n;i++)
   {for(j=1;j<=n;j++)
       cout<<a[i][j]<<" ";
   cout<<endl;} 
cout<<"x=";cin>>x;
dfsuc(x);
cout<<endl<<"succesorii lui "<<x<<endl;
for(i=1;i<=n;i++)
   if(suc[i]!=0)
      cout<<i<<" "; 
dfprec(x);
cout<<endl<<"Predecesorii lui "<<x<<endl;
for(i=1;i<=n;i++)
   if(prec[i]!=0)
      cout<<i<<" ";
cout<<endl<<"componenta tare conexa in care se gaseste "<<x<<" este "<<endl;
for(i=1;i<=n;i++)
  if(prec[i]==suc[i]&&suc[i]!=0)
      cout<<i<<" ";}

Matrice de adiacenta

Matricea de adiacentă 


Fie G=(V; U) un graf orientat cu n vârfuri (V={ 1,2, ..., n}) şi m arce.
Matricea de adiacentă (A∈Mn({0,1})), asociată grafului G, este o matrice pătratică de ordin n, cu
elementele:


 (altfel spus, ai,j=1, dacă există arc între i şi j şi ai,j=0 dacă nu există arc între i şi j. )

• Exemplul 1.                                                         • Exemplul 2. 
Fie graful reprezentat ca în figura de mai jos:           Fie graful reprezentat ca în figura de mai jos:


* Comentarii: 
l. Matricea de adiacenŃă este o matrice pătratică, de ordin n, şi nu este neapărat simetrică faŃă de diagonala 
principală, aşa cum este în cazul grafurilor neorientate. 

Matricea vârfuri-arce ( matricea de incidentă) 

 
Fie G=(V, U) un graf orientat cu n vârfuri (V={1,2, ..., n}) şi m arce. 
Matricea vârfuri-arce (B∈Mnxm({-1,0,1})), asociată grafului G, este o matrice cu n linii şi m coloane, cu 
elementele:






• Exemplul 1. Fie graful G=(V,U) : 
V={1,2,3,4}, 
U={(1,3),(2,3),(2,4),(4,1)}= {u1, u2, u3, u4} 


Aplicatii

Problema 1:

Determinati vecinii unui varf al unui graf orientat.

Exemplu:
Pentru varful 1, vecinii sunt: 2,3, si 4



















Problema 2:

Determinati gradele exterioare si interioare ale varfurilor unui graf, gradul exterior minim, gradul
exterior maxim, gradul interior minim si gradul interior maxim.

Exemplu:
Pentru varful 1:
d+(1)= 2, d-(1)= 2
min d+(3,5)= 0, max d+(1,2)= 2
min d-(4)= 0, max d-(1)= 2



















  Subiecte tip grila


1. Graful neorientat cu 60 de noduri, numerotate de la 1 la
60, are numai muchiile [1,60], [60,20], [20,30] si [4,3].
Numarul componentelor conexe ale grafului este egal
cu:

a) 3 b) 56 c) 54 d) 0














Raspuns: b) 56
Avem 4 muchii intre 6 noduri formand 2 componente
conexe.
Din 60 scadem cele 6 noduri si raman 54 de noduri izolate
à adica 54 de componente conexe
Deci sunt 54 + 2 = 56 componente conexe
 


2. Se considera graful neorientat cu 7 noduri
numerotate de la 1 la 7 si muchiile [1,2], [1,3],
[2,3], [2,4], [2,5], [2,6], [4,6], [5,7], [6,7].

Care este numarul minim de muchii care trebuie
eliminate pentru ca acest graf sa contina 3
componente conexe?













Raspuns: 3
Raman 2 noduri izolate(1,3) si o componenta conexa (2,4,5,6,7)
 3 componente conexe


3. Se considera graful neorientat din figura alaturata. Care este
numarul minim de muchii ce se pot elimina astfel incat graful

partial obtinut sa aiba exact 3 componente conexe?

a) 2 b) 4 c) 1 d) 3












Raspuns: b) 4                         
4 - raman 2 noduri
izolate + 1 componenta conexa
 3 componente conexe


 4. Care este numarul maxim de componente
conexe pe care le poate avea un graf neorientat
cu 20 de noduri si 12 muchii?

a) 6 b) 12 c) 10 d) 15
Raspuns: d) 15
Trebuie sa adaugam 12 muchii intre cat mai putine noduri.
Folosim formula: n(n-1)/2, n-numarul de noduri (formula ne ajuta sa aflam
numarul muchiilor dintr-un graf neorientat complet)
6(6-1)/2=15- intre 6 noduri putem adauga 15 muchii - avem 6 noduri care
formeaza o componenta conexa si 14 noduri izolate
 1+14 = 15 componente conexe




5. Se considera graful orientat reprezentat prin
listele de adiacenta alaturate. Cate noduri au
gradul extern mai mare decat gradul intern?




















 6. Se considera un graf orientat cu 6 noduri care
are urmatoarele proprietati:
- Suma gradelor externe ale tuturor varfurilor
grafului este egala cu 6.
- Sunt numai 3 varfuri care au gradul intern egal
cu 1

Care este valoarea maxima pe care o poate avea

gradul extern al unui varf din graful dat? 

joi, 8 mai 2014

Parcurgerea grafurilor orientate


             Prin algoritmul BF se realizeaza o parcurgere a grafului „în lăţime“. Se vizitează un vârf iniţial s, apoi vecinii săi (vârfurile adiacente cu s), după aceea vecinii vecinilor lui s (nevizitaţi încă), etc.

Observatie!

  • Dacă graful nu este conex nu se pot vizita toate vârfurile.

Structuri de date necesare pentru implementare sunt:

1. Matrice de adiacenţă (sau alte variante de reprezentare): a

2. Coada (în care se memorează în ordinea parcursă nodurile vizitate): c
– p, u - indicatorii primului şi ultimului element din coadă

3. Vectorul nodurilor vizitate: viz
– viz[i]=1, dacă i a fost vizitat
– viz[i]=0, altfel

              Parcurgerea BF(Breath First) se efectuează prin utilizarea structurii numită coadă, având grijă ca un nod să fie vizitat o singură dată.

              Atunci când un nod a fost introdus în coadă, se marchează ca vizitat.
Observatie!

  •   Algoritmul se adaptează astfel încât să poată fi luaţi în considerare toţi vecinii unui nod.

Exemplu: 
X = {1, 2, 3, 4, 5}; 

U = {(1,2), (2,1), (1,3), (2,5), (4,1)}; 



         Algoritmul DF (Depth First) se caracterizează prin faptul că realizează o parcurgere a grafului „în adâncime“ atât cât este posibil.

• Parcurgerea începe cu un vârf s ales inițial.

• Prelucrarea unui vârf conduce la prelucrarea primului său vecin încă nevizitat, apoi se prelucrează primul vecin al acestuia care nu a fost încă vizitat, etc.

Structuri de date necesare implementării:

1. Matrice de adiacenţă (sau alte variante): a

2. Stiva: s (în care se memorează nodurile în ordinea parcurgerii). Dacă se implementează varianta recursivă, se va folosi stiva procesorului

3. Vectorul nodurilor vizitate: viz

Exemplu:


Reprezentarea grafurilor orientate

           Există mai multe moduri de reprezentare a grafurilor,alegerea făcându-se în funcţie de tipurile de operaţii care urmează să se efectueze:
1.Matricea de adiacenţă: face o asociere întrevârfuri şi indicii matricei. Este o matrice pătratică cu nxn elemente, unde n este numărul de noduri.


Observatie! 

  • Matricea de adiacenţă a unui graf orientat nu este simetrică faţă de diagonala principală.
Observatie!

  • Numarul de valori “1” de pe linia “i” reprezintă gradul exterior al nodului “i”.
Observatie! 
  • Numarul de valori “1” de pe coloana “i” reprezintă gradul interior al nodului “i”.
2. Matricea de incidenţă (matricea vârfuri-arce): este o matrice cu n linii şi m coloane,unde n este numărul de vârfuri şi m este numărul de arce; pe linii se reţin vârfurile, 
pe coloane se reţin muchiile; matricea are valorile 0, 1 şi -1. 


Observatie !
  •  Completarea matricei se face coloană cu coloană. Pe fiecare coloană sunt două valori diferite de 0 (1 pentru vârful iniţial, -1 pentru vârful final) iar celelalte valori sunt 0. 


Observatie !
  •  Numarul de valori “1” de pe linia “i” reprezintă gradul exterior al nodului “i”. 


Observatie !
  •  Numarul de valori “-1” de pe linia “i” reprezintă gradul interior al nodului “i”. 

 3.Matricea drumurilor: este o matrice pătratică cu nXn noduri unde n este numărul de vârfuri.




Observatie !
  •     Matricea drumurilor se obtine din matricea de adiacenta algoritmului lui Roy Warshall.

Observatie !
  •    Se utilizează pentru a arăta dacă un graf este tare conex sau nu. 


  •   Dacă are în matrice numai valori de 1, inseamnă 

că graful este tare conex.

4. Matricea costurilor: pentru reprezentarea grafurilor valorice. Este o matrice cu nXn elemente, unde n este numărul de noduri.

Observatie !
  • Matricea de costurilor unui graf orientat nu este simetrică faţă de diagonala principală.

5. Liste de adiacenţă: Pentru fiecare nod se memorează o listă a vecinilorsăi. Pentru întregul graf este necesar un vector de liste (P) în care Pi este adresa primului element al listei asociate lui i.





Problema drumurilor minime corespunzătoare tuturor perechilor de noduri ("All-Pairs Shortest Path Problem") 

  • Se presupune că există un graf orientat ponderat conţinând timpii de zbor pentru anumite trasee aeriene care conectează oraşe şi că se doreşte construcţia unei tabele care furnizează cei mai scurţi timpi de zbor între oricare două oraşe. 
  • Aceasta este o instanţă a problemei drumurilor minime corespunzătoare tuturor perechilor de noduri (“all-pairs shortest paths problem”).  
  • Pentru a formula problema în termeni formali, se presupune că se dă un graf orientat G=(N,A), în care fiecare arc (x,y) are o pondere pozitivă COST[x,y]. 
  • Rezolvarea problemei drumurilor minime corespunzătoare tuturor perechilor de noduri pentru graful G, presupune determinarea pentru fiecare pereche ordonată de noduri (x,y),unde x,y Є N, a lungimii drumului minim care conectează nodul x cu nodul y.  
  • Această problemă poate fi rezolvată cu ajutorul algoritmului lui Dijkstra, considerând pe rând, fiecare nod al grafului G drept origine.  
  • De fapt rezultatul execuţiei algoritmului lui Dijkstra este un tablou care conţine distanţa de la origine la restul nodurilor grafului.  
  • În cazul de faţă, deoarece este necesară determinarea distanţelor pentru toate perechile de noduri, avem nevoie de o matrice de elemente în care fiecare rând se poate determina în baza algoritmului lui Dijkstra.  
  • rezolvare mai directă a problemei drumurilor minime corespunzătoare tuturor perechilor de noduri ale unui graf, este datorată algoritmului lui R.W. Floyd datând din anul 1962.

Algoritmul lui Floyd

  • Fie graful ponderat G=(N,A)are are ataşată matricea de ponderi COST.  
  • Pentru convenienţă, se consideră că nodurile mulţimii N sunt numerotate de la 1 la n. 
  • Algoritmul lui Floyd utilizează o matrice A de dimensiuni nXn cu ajutorul căreia determină lungimile drumurilor minime. 
  • Iniţial se face A[i,j]=COST[i,j] pentru toţi i ≠ j. 
  • Dacă nu există niciun arc de la nodul i la nodul j, se presupune că COST[i,j]= ∞. 
  • Elementele diagonalei matricei A se pun toate pe 0. 
  • Algoritmul lui Floyd execută n iteraţii asupra matricii A. 
  • După cea de-a k-a iteraţie, A[i,j] va conţine lungimea minimă a unui drum de la nodul i la nodul j, care nu trece prin nici un nod cu număr mai mare ca şi k.  
  • Cu alte cuvinte, i şi j pot fi oricare două noduri ale grafului care delimitează începutul şi sfârşitul drumului, dar orice nod intermediar care intră în alcătuirea drumului trebuie să aibă numărul mai mic sau cel mult egal cu k. 
  • Se face precizarea că indicele k semnifică momentul de timp la care se realizează calculul matricei A (în cadrul celei de-a k iteraţii) şi nu faptul că ar exista n matrici A, fiind utilizat pentru o înţelegere mai facilă a funcţionării algoritmului. 
  • Pentru calculul lui Ak[i,j] se compară Ak-1[i,j] - adică costul drumului de la i la j fără a trece prin nodul k sau oricare alt nod cu număr mai mare ca şi k, cu Ak-1[i,k]+Ak-1[k,j] - adică costul drumului de la i la k însumat cu costul drumului de la k la j fără a trece prin nici un nod cu număr mai mare ca şi k. 
  • Dacă drumul din urmă se dovedeşte a fi mai scurt, atunci el este atribuit valorii Ak[i,j], altfel aceasta rămâne identică cu valoarea anterioară. 
  • Pentru graful ponderat din figura 12.2.1.b. (a), se prezintă în cadrul aceleiaşi figuri modul în care se modifică matricea A pornind de la conţinutul ei iniţial A0 şi terminând cu conţinutul său final A3. 

Calculul lungimii drumurilor minime corespunzătoare tuturor perechilor de noduri ale unui graf utilizând algoritmul lui Floyd 

  • Deoarece Ak[i,k]=Ak-1[i,k] şi Ak[k,j]=Ak-1[k,j], nici o intrare a matricii A în care intervine pe post de indice valoarea k, nu se modifică în timpul celei de-a k-a iteraţii. 
  • Cu alte cuvinte, matricea A este invariantă în raport cu indicele k. 
  • În consecinţă se poate utiliza o singură copie a matricii A. 
  • Structura de principiu a procedurii care implementează algoritmul lui Floyd în baza considerentelor mai sus enunţate apare în secvenţa [12.2.1.a]. 
------------------------------------------------------------ 
PROCEDURE Floyd(VAR A: ARRAY[1..n,1..n] OF real; 
 COST: ARRAY[1..n,1..n] OF real); 
 
{Procedura determină matricea drumurilor minime A pornind de 
la matricea ponderilor COST
 
 VAR i,j k: INTEGER; 
 
 BEGIN 
[1]    FOR i:= 1 TO n DO 
[2]    FOR j:= 1 TO n DO 
[3]    A[i,j]:= COST[i,j];                 [12.2.1.a] 
[4]    FOR i:= 1 TO n DO 
[5]    A[i,i]:= 0; 
[6]    FOR k:= 1 TO n DO 
[7]    FOR i:= 1 TO n DO 
[8]    FOR j:= 1 TO n DO 
[9]      IF A[i,k] + A[k,j] < A[i,j] THEN 
[10]    A[i,j]:= A[i,k] + A[k,j] 
         END; {Floyd} 
------------------------------------------------------------

  • Timpul de execuţie al acestei proceduri este în mod clar proporţional cu O(n3) deoarece la baza sa stă o buclă triplă încuibată. 
  • Verificarea corectitudinii funcţionării algoritmului se poate realiza simplu prin metoda inducţiei. 
  • Astfel este uşor de demonstrat că după ce k trece prin bucla triplă FOR, A[i,j] memorează lungimea celui mai scurt drum de la nodul i la nodul j care în niciun caz nu trece printr-un nod cu număr mai mare ca şi k [AH85]. 



Conexitate

                                         Conexitate



Lant


Definitie: Fie G=(V, U) un graf orientat. Se numeşte lant, în graful G, o succesiune de arce, notată 
L=[ui1 ,ui2 ,...,uikcu proprietatea ca oricare două arce consecutive au o extremitate comună (nu are importantă orientarea arcelor). 


Se întâlnesc notiunile: 

- extremitătile lantului 
• fiind dat lantul L=[ui1 ,ui2 ,...,uikse numesc extremităti ale sale extremitatea arcului ui1 care nu este 
comună cu arcul ui2 şi extremitatea arcului uik care nu este comună cu arcul uik-1 
- lungimea lantului 
• fiind dat lantul L=[ui1 ,ui2 ,...,uikprin lungimea sa se întelege numărul de arce care apar în L; 

• Exemplu de lant: 
cu reprezentarea grafică astfel: 
Fie graful G=(V, U), unde: V={1,2,3,4,5} 
                                                U={(1,3),(1,4), (2,3), (2,4), (5,2)}= { u1, u2, u3, u4, u5 } 





L1=[ u1 ,u3 ,u5] este, în graful G, lanŃ cu lungimea 3 şi extremităŃile 1 şi 5. 
L2=[ u1 ,u2, u4, u5] este, în graful G, lanŃ cu lungimea 4 şi extremităŃile 3 şi 5. 


Atentie! Dacă L=[ui1 ,ui2 ,...,uikeste lant în graful G, atunci şi L=[uik ,uk-1 ,...,ui1

 este lant în graful G. 



Drum

Definitie: Fie G=(V, U) un graf orientat. Se numeşte drum, în graful G, o succesiune de noduri, notată D=(xi1 ,xi2 ,...,xik), cu proprietatea (xi1 ,xi2),..., (xik-1 ,xik) ∈ U(altfel spus (xi1 ,xi2),..., (xik-1 ,xik) sunt arce).

Se întâlnesc notiunile: 

- extremitătile drumului 
• fiind dat drumul  D=(xi1 ,xi2 ,...,xik) se numesc extremităti ale sale nodurile xi1 şi xik (xi1 extremitate initială şi xik extremitate finală) 
- lungimea drumului 
• fiind dat drumul D=(xi1 ,xi2 ,...,xik) , prin lungimea sa se întelege numărul de arce care apar în cadrul său; 
• Exemplu de drum:
Fie graful G=(V, U) unde:
V={ 1,2,3,4,5 }
U={(1,3), (4,1), (3,2), (2,4), (5,2)}
cu reprezentarea grafică astfel: 


D1=(1, 3, 2) este, în graful G, drum cu lungimea 2 şi extremitătile 1 şi 2. 
D2=(4, 1, 3, 2) este, în graful G, drum cu lungimea 3 şi extremitătile 4 şi 2

Atentie! Dacă D=(xi1 ,xi2 ,...,xik) este drum, în graful G, atunci nu neapărat şi D1=(xik ,xik-1 ,xi) este drum, în graful G.


Definitie: Fie G=(V,U) un graf orientat. Se numeşte drum elementar, în graful G, drumul 
 D=(xi1 ,xi2 ,...,xikcu proprietatea că oricare două noduri ale sale sunt distincte (altfel spus, printr-un nod nu se trece decât o singură dată). 

Exemplu: în graful de mai jos, 

     
drumul D1=(4, 1, 3, 2) este drum elementar.





Definitie: Fie G=(V, U) un graf orientat: Se numeşte drum neelementar, în graful G, drumul 
D=(xi1 ,xi2 ,...,xikcu proprietatea că nodurile sale nu sunt distincte două câte două (altfel spus, prin anumite noduri s-a trecut de mai multe ori). 

• Exemplu: în graful de mai jos,
drumul D2=(4, 1, 3, 2, 4, 5, 2) este drum neelementar (prin 4 (şi 2) 
s-a trecut de două ori).

Definitie Un drum hamiltonian într-un graf orientat este un drum care conţine toate vârfurile grafului.



Circuit


Definitie: Fie G=(V, I) un graf neorientat. Se numeşte circuit, în graful G, drumul D=(xi1 ,xi2 ,...,xik

cu proprietatea că xi1 = xik şi are arcele cel compun diferite două câte două (circuitul se notează în continuare cu C). 

• Exemplu: în graful de mai jos, 



drumul C=(1, 3, 2, 4, 1) este circuit. 





Definitie: Fie G=(V, U) un graf orientat. Se numeşte circuit elementar, în graful G, un circuit cu proprietatea că oricare două noduri ale sale, cu exceptia primului şi a ultimului, sunt distincte. 


Exemplu: în graful de mai jos, 


circuitul C=(1, 3, 2, 4, 1) este circuit elementar. 



Definitie: Fie G=(V, U) un graf orientat. Se numeşte circuit neelementar, în graful G, un circuit cu 
proprietatea că nodurile sale, cu exceptia primului şi a ultimului, nu sunt distincte. 

Exemplu: în graful de mai jos 

circuitul C=(1, 3, 4, 2, 5, 4, 1) este circuit neelementar (prin 4 s-a trecut de două ori). 





Definitie : Intr-un graf orientat G=(X,U) se numeşte circuit hamiltonian un circuit elementar care conţine toate vârfurile grafului. 

Definitie:  Intr-un graf orientat G=(X,U) se numeşte circuit eulerian un circuit care conţine toate 
arcele grafului. 

Definitie: Se numeşte graf eulerian un graf care conţine un circuit eulerian. 

Graf conex

Definitie: Fie G=(V, U) un graf orientat. Graful G se numeşte conex dacă pentru oricare două vârfuri x şi y,  x#y, există un lant de extremităti x şi y. 

Exemplu de graf care este conex: 


Graful este conex, deoarece oricare ar fi vârfurile x şi y, x#y, există un lant in G care să le lege. 




Exemplu de graf care nu este conex: 



  Graful nu este conex, deoarece există două vârfuri, cum ar fi 1 şi 4, pentru care nu există nici un lant în graf 
care să le lege. 


Definitie: Un graf este tare conex dacă pentru oricare două vârfuri x, y  X există un drum de la x la y şi un drum de la y la x.

Exemplu:
-Graf tare conex





Componentă conexă 

Definitie: Fie G=(V, U) un graf orientat. Se numeşte componentă conexă un graf orientat G1=(V1 ,U1) care verifică următoarele conditii: 
- este subgraf al grafului G; 
- este conex; 
- nu există nici un lant în G care să lege un nod din V, cu an nod din V-V1. 

Exemplu: Fie graful G=(V, U) : V={1,2,3,4,5} şi U={(1,2), (3,1), (3,2), (4,5)} 








Pentru graful de mai sus, graful G1=(V1,U1) unde: V1={4,5} şi U1={(4,5)} este componentă conexă, 
deoarece: 
- este subgraf al grafului G; 
- este conex; 
- nu există nici un lant în G care să lege un nod din V, cu un nod din V-V1={1,2,3} 

La fel, se poate spune şi despre graful G2=(V2,U2) unde: V2={1,2,3) şi U2={(1,2)> (3,1), (3,2)} 
În concluzie, graful din figura de mai sus este format din două componente conexe. 

Observatie: Fie G=(V, U) un graf orientat. Graful G este conex dacă şi numai dacă este format dintr-o 
singură componentă conexă. 

• Exemplu de graf conex (este format dintr-o singură componentă conexă):







Definitie: O componentă tare conexă a unui graf orientat G=(X, U) este un subgraf G1=(X1,Y1) al lui G care este tare conex şi care este maximal în raport cu această proprietate (adică oricare ar fi x  X\X1,
subgraful lui G generat de X1{x} nu mai este tare conex).

Exemplu:
-Graf cu doua componente tare conexe