Info clasa
- 1. #include<fstream.h>
#include <cstdio>
#include <conio.h>
#include<iostream.h>
ifstream fin("grafn.in");
ofstream fout("grafn.out");
using namespace std ;
struct muchie
{
int x,y,c;
}e[100];
class grafn {
private:
int n,m,a[50][50];
muchie e[50];
public:
grafn();
grafn(grafn&);
~grafn();
void comp();
void citire();
void afisare();
friend void operator- (grafn &A, grafn &B) ;
void BF(int ,int, int viz[]);
void Kruskal();
friend istream & operator>>(istream & is,grafn & g);
friend ostream & operator<<(ostream & os,grafn & g);
};
grafn::grafn()
{
int i , j ;
n=0;
for (i=1;i<=49;i++)
for (j=1;j<=49;j++)
a[i][j]=0;
}
grafn::grafn(grafn&g)
{
int i,j;
n=g.n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=g.a[i][j];
}
grafn :: ~ grafn()
{
fout<<"apel pentru distrugerea grafului"<<this<<'n';
}
void grafn :: citire()
{
int i,x,y;
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>x>>y;
a[x][y]=a[y][x]=1;
- 2. e[i].x=x; e[i].y = y; fin>>e[i].c;
}
}
void grafn :: afisare()
{
int i,j;
fout<<n<<'n';
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
fout<<a[i][j]<<' ';
fout<<'n';
}
}
void grafn :: BF(int x0, int nc , int viz[])
{
int c[100]={0},p,u,z,i;
c[0]=x0;
p=u=0;
viz[x0]=nc;
while(p<=u)
{
z=c[p];
p++;
for(i=1;i<=n;i++)
if(a[z][i]==1 && viz[i]==0)
{
u++;
c[u]=i;
viz[i]=nc;
}
}
}
void grafn :: comp()
{
int nrc=0,vz[100]={0},i;
for(i=1;i<=n;i++)
if(vz[i]==0)
{
nrc++;
BF(i,nrc,vz);
}
int j;
cout << " Numarul de componente conexe: "<<nrc<<'n';
for ( i =1 ; i<=nrc;++ i )
{
cout << " Componenta "<<i<<" contine nodurile : ";
for ( j = 1 ; j<=n;++j)
if ( vz[j]==i)
cout << j << ' ' ;
cout <<'n';
}
}
void grafn :: Kruskal()
- 3. {int r,t,ct=0,nrm=0,i=0,j,u,v,l[100],aux;
for(i=1;i<=n;i++)
l[i]=i;
for(i=1;i<=m;i++)
for(j=i+1;j<=m;j++)
if(e[i].c>e[j].c)
{
aux=e[i];
e[i]=e[j];
e[j]=aux;
}
i=0;
while(nrm<n-1)
{
u=e[i].x;
v=e[i].y;
if(l[u]!=l[v])
{
t=l[u];
r=l[v];
for(j=1;j<=n;j++)
if(l[j]==t)
l[j]=r;
ct=ct+e[i].c;
fout<<e[i].x<<' '<<e[i].y;
}
}
fout<<ct<<endl;
}
istream & operator>>(istream & is,grafn &g)
{
int i,m,x,y;
cout << " Dati numarul de noduri: n" ;
is>>g.n ;
cout << " Dati numarul de muchii: n" ;
is>>m;
for(i=1;i<=m;i++)
{
is>>x>>y;
g.a[x][y]=g.a[y][x]=1;
}
return is;
}
ostream & operator<<(ostream & os ,grafn &g)
{
int i,j;
if (g.n==1)
os << " Graful are un nod n";
else
os << " Graful are "<<g.n<<" noduri n";
//os<<g.n<<'n';
os << " Matricea de adiacenta a grafului selectat:n";
for(i=1;i<=g.n;i++)
- 4. {
for(j=1;j<=g.n;j++)
os<<g.a[i][j]<<" ";
os<<'n';
}
return os;
}
void operator- (grafn &A, grafn &B)
{
int i , j , minn ;
minn=A.n;
if ( minn>B.n)
minn=B.n;
for ( i = 1; i <= minn ; ++ i)
for ( j = 1; j<= minn ;++ j )
if ( A.a[i][j]==B.a[i][j] && A.a[i][j] )
A.a[i][j] = A.a[j][i]= 0;
}
int main()
{
int c ;
grafn A[3];
//meniul vietii :
do {
system ("cls");
cout<<" 1. Citeste graf n";
cout<<" 2. Afiseaza graf n";
cout<<" 3. Diferenta intre grafuri n";
cout<<" 4. Afiseaza componente conexe n";
cout<<" 0. Iesire n";
cin>>c;
switch (c)
{
case 1 :
{
int x ;
system ("cls");
cout << " 1. Citeste primul graf n";
cout << " 2. Citeste al doilea graf n";
cin >> x;
system ("cls");
cin>>A[x];
break ;
}
case 2 :
{
int x ;
system ("cls");
cout << " 1. Afiseaza primul graf n";
cout << " 2. Afiseaza al doilea graf n";
cin >> x ;
system ("cls");
cout << A [ x ];
getch();
break ;
}
case 3 :
{
- 5. int x , y;
system ("cls");
cout << " Afiseaza diferenta X - Y n";
cout << " Dati X: " ;
cin >> x;
cout << " Dati Y: " ;
cin >> y;
cout << 'n' ;
system ("cls");
cout << " Situatia grafului "<< x << " inaintea efectuarii operatiei: n";
cout << A[x];
cout << 'n';
cout << " Situatia grafului "<< y << " inaintea efectuarii operatiei: n";
cout << A[y];
cout << 'n';
A[x]-A[y];
cout << " #########################################################nn";
cout << " Situatia grafului "<< x << " dupa efectuarea operatiei: ";
cout << A[x];
cout << 'n';
getch();
break ;
}
case 4 :
{
int x;
system ("cls");
cout << " 1. Primul graf n";
cout << " 2. Al doilea graf n";
cin >> x ;
system ("cls");
A[x].comp();
getch();
break ;
}
}
} while (c) ;
}