190 likes | 435 Vues
ARBORI. ?. ?. ?. ?. 2. 5. 6. 7. 1. 4. 3. 11. 8. 9. 10. Am ob ţ inut un graf G = (V,E). 2. 5. 6. 7. 1. 4. 3. 11. 8. 9. 10. ce conţine n =11 varfuri , m =10 muchii. Este un graf conex ?. Da !. Are cicluri ?. Nu !. 2. 5. 6. 7. 1. 4. 3. 11. 8. 9. 10.
E N D
? ? ?
2 5 6 7 1 4 3 11 8 9 10
Am obţinut un grafG = (V,E) 2 5 6 7 1 4 3 11 8 9 10 ce conţine n=11 varfuri, m=10 muchii
Este un graf conex? Da ! Are cicluri ? Nu ! 2 5 6 7 1 4 3 11 8 9 10 Atunci, acesta se va numi ARBORE
Definiţie Numim arboreun graf neorientatcare este conex şi nu conţine cicluri.
1 2 3 5 4 Problemă • Se citeşte un graf. Să se scrie un program care verifică dacă este arbore.
Rezolvare Verificăm dacă este conex Dacă într-o parcurgere DF (BF) se vizitează toate nodurile, graful este conex. Verificăm dacă are cicluri Prin aceeaşi parcurgere DF (BF), dacă există cel puţin o a doua tentativă de vizitare a unui nod.
C++ #include <iostream.h> #include <fstream.h> int s[50], n, gasit, i, A[30][30], suma; void citire(int A[30][30], int &n) { int i, j; ifstream f("graf.txt"); f>>n; for(i=1;i<=n;i++) for(j=1;j<=n;j++) f>>A[i][j]; f.close(); }
C++ void df(int nod) { int k; s[nod]=1; for(k=1;k<=n;k++) if(A[nod][k]==1) { A[k][nod]=0; if (s[k]==0) df(k); else gasit=1; } }
C++ void main() { citire(A,n); df(1); suma=0; for(i=1;i<=n;i++) suma=suma+s[i]; if(suma!=n) cout<<"Graful nu este conex"; else if(gasit) cout<<"Graful are ciclu"; else cout<<"Graful este arbore"; cout<<endl; }
Teoremă Fie Gun graf neorientat cu n noduri. G este arbore dacă şi numai dacă are n-1 muchii şi nu conţine cicluri.