Verificare conexitate
Enunt:
În fişerul text graf.in este memorat un graf neorientat, astfel:
pe prima linie un număr natural n, care reprezintă numărul de noduri ale unui graf neorientat.
pe următoarele linii sunt memorate câte două numere naturale care reprezintă muchiile grafului.
Scrieţi un program care să verifice dacă graful este conex.
Exemplul 1:
Continutul fişierului text graf.in
8
1 3
1 2
1 5
2 5
2 6
4 8
Rezultate asteptate
Dacă nodul de start este 1 atunci se vor afişa următoarele rezultate:
Graful NU este conex!
Graful memorat în fişerul text de mai sus are următorul aspect grafic:
Exemplul 2:
Continutul fişierului text graf.in
5
1 2
1 4
1 5
2 3
2 5
3 5
3 4
4 5
Rezultate asteptate
Dacă nodul de start este 1 atunci se vor afişa următoarele rezultate:
Graful este conex!
Graful memorat în fişerul text de mai sus are următorul aspect grafic:
Program C++:
#include<iostream>
#include<fstream>
using namespace std;
int a[20][20],c[20],v[20],ns,n,comp;
int prim;
int ultim;
// citirea grafului din fisier text si construirea matricei de adiacenta
void citire(int a[20][20], int &n)
{ ifstream f("graf.in");
int x,y;
f>>n;
while(f>>x>>y)
a[x][y]=a[y][x]=1;
f.close();
}
// afisarea pe ecran a matricei de adiacenta
void afisare(int a[20][20],int n)
{ cout<<"Matricea de adiacenta este : "<<endl;
for( int i=1;i<=n;i++)
{ for(int j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}
// returnează primului nod nevizitat
int exista_nod_nevizitat(int v[20], int n)
{ for(int i=1;i<=n;i++)
if(v[i]==0)
return i; // primul nod nevizitat
return 0; // nu mai exista noduri nevizitate
}
// parcurgerea în latime a unei componente conexe, plecând din nodul de start ns
void parcurgere_latime(int a[20][20], int n,int ns)
{ comp++;
v[ns]=1;
cout<<"Componenta conexa : "<<comp<<" este formata din nodurile :";
cout<<ns<<" ";
prim=ultim=1;
c[ultim]=ns;
while(prim<=ultim)
{for(int i=1;i<=n;i++)
if(a[c[prim]][i]==1)
if(v[i]==0)
{ ultim++;
c[ultim]=i;
cout<<i<<" ";
v[i]=1;
}
prim++;
}
cout<<endl;
}
// functia principala main()
int main()
{ citire(a,n);
afisare(a,n);
parcurgere_latime(a,n,1);
if (exista_nod_nevizitat(v,n)!=0)
cout<<"Graful NU este conex!";
else
cout<<"Graful este conex!";
return 0;
}