Matricea lanturilor

 

Fie G=(V, E) un graf neorientat, unde V are n elemente (n noduri) si E are m elemente (m  muchii). Lui G i se asociaza  matricea D numita matricea lanturilor,  cu n linii si n coloane.

 

Astfel: D = (di j) n x n cu:

 

 


                            1, daca exista lant de la i la j

d[i,j]=                                                                                        

                            0, altfel

 

 

Matricea lanturilor ca si matricea de adiacenta, in cazul grafurilor neorientate , este o matrice simetrica (daca exista lant de la i la j exista si lant de la j la i).

 

Grafului de mai jos i se asociaza urmatoarea matrice a lanturilor:

 

0 1 1 1 1 0 0

1 0 1 1 1 0 0

1 1 0 1 1 0 0

1 1 1 0 1 0 0

1 1 1 1 0 0 0

0 0 0 0 0 0 1

0 0 0 0 0 1 0

 

 

 Linia k (sau coloana k) a matricei lanturilor ne arata nodurile j pentru care exista lant de k la j ( si de la j la k). Spre exemplu, pentru nodul 3 .

 

0 1 1 1 1 0 0

1 0 1 1 1 0 0

1 1 0 1 1 0 0

1 1 1 0 1 0 0

1 1 1 1 0 0 0

0 0 0 0 0 0 1

0 0 0 0 0 1 0

 

 Nu se poate ajunge de la nodul 3 la nodurile 6 sau 7.

 

Problema:

Fiind dat un graf neorientat, memorat prin intermediul matricei de adiacenta, se cere sa se creeze si sa se tipareasca matricea lanturilor.

 

Se observa ca parcurgand in adancime (sau in latime) graful pornind de la nodul nod=3 spre exemplu vectorul de “vizitati” este:

1 1 1 1 1 0 0. Daca se inlocuieste viz[nod]=viz[3]=0 se obtine: 1 1 0 1 1 0 0  si se poate incarca linia 3 din matricea lanturilor cu continultul vectorului de vizitati. Prin urmare se parcurge df graful pornind de la fiecare nod in parte si se incarca de fiecare data continutul vectorului viz in matricea lanturilor in linia corespunzatoare. Iata o solutie:

 

#include<fstream.h>

#include<conio.h>

int a[20][20],n,m,viz[100],gasit,drum[20][20];

 

void dfmr(int nod)

{ viz[nod]=1;

 for(int k=1;k<=n;k++)

      if(a[nod][k]==1&&viz[k]==0)

               dfmr(k);      

}

 

 

void main()

{int x,y,j;

fstream f;

clrscr();

 f.open("muchii.txt",ios::in); //citire matrice de adiacenta din fisier

 if(f)

   cout<<"ok!"<<endl;

 else

   cout<<"eroare la deschidere de fisier!";

 f>>n>>m;

 for(int i=1;i<=m;i++)

    {f>>x>>y;

     a[x][y]=a[y][x]=1;}

cout<<endl<<"matricea de adiacente"<<endl;

for(i=1;i<=n;i++)

   {for(j=1;j<=n;j++)

       cout<<a[i][j]<<" ";

   cout<<endl;}

int nod;

for(nod=1;nod<=n;nod++) //parcurgere graf incepand de la fiecare nod

   {for(j=1;j<=n;j++)

            viz[j]=0;  //pentru fiecare nod se face vectorul viz in prealabil 0

   dfmr(nod);

   viz[nod]=0;

   for(j=1;j<=n;j++) //incarcare vector viz in matrice drum

      drum[nod][j]=viz[j];

   }

cout<<endl<<"matricea drumurilor "<<endl;

for(i=1;i<=n;i++)

    {for(j=1;j<=n;j++)

              cout<<drum[i][j]<<" ";

     cout<<endl;}

getch();}