#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;
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()
{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++)
{
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 :
{
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) ;
}

Info clasa

  • 1.
    #include<fstream.h> #include <cstdio> #include <conio.h> #include<iostream.h> ifstreamfin("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; } voidoperator- (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) ; }