Documente Academic
Documente Profesional
Documente Cultură
Laborator 3
Graf parial i subgraf
1. Se citesc de la tastatur m perechi de numere ntregi reprezentnd
extremitile muchiilor unui graf neorientat G cu n vrfuri i m muchii i m1
perechi de numere ntregi reprezentnd extremitile muchiilor unui graf
neorientat G1 cu n1 vrfuri i m1 muchii. S se verfice dac G1 este graf parial
al lui G.
#include <iostream.h>
int a[20][20],gp[20][20],n,m,n1,m1;
void citire_graf(int a[20][20],int n,int m)
{
int x,y;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
a[i][j]=0;
for(i=0;i<m;i++)
{
cout<<"muchia cu numarul de ordine "<<i<<":";
cout<<"x="; cin>>x;
cout<<"y="; cin>>y;
a[x][y]=1;
a[y][x]=1;
}
}
void afisare_matrice(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;
}
}
int verificare()
{
if(n1!=n)
return 0;
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
if((gp[i][j]==1)&&(a[i][j]==0))
1
Algoritmica grafelor
return 0;
return 1;
}
void main()
{
cout<<"Introduceti numarul de noduri din graful G:";
cin>>n;
cout<<"Introduceti numarul de muchii din graful G:";
cin>>m;
citire_graf(a,n,m);
cout<<"Introduceti numarul de noduri din graful
partial:";
cin>>n1;
cout<<"Introduceti numarul de muchii din graful
partial:";
cin>>m1;
citire_graf(gp,n1,m1);
afisare_matrice(a,n);
afisare_matrice(gp,n1);
if(verificare())
cout<<"gp este graf partial pt graful g";
else
cout<<"gp este nu graf partial pt graful g";
}
Algoritmica grafelor
while((x!=0)&&(y!=0))
{
a[x][y]=1;
a[y][x]=1;
cin>>x>>y;
}
}
void citire_subgraf()
{
int x;
nn=0;
cout<<"Introduceti nodurile subgrafului. Terminati cu
valoarea 0:";
cin>>x;
while(x!=0)
{
nm++;
m[nn]=x;
cin>>x;
}
cout<<"Introduceti numarul de muchii al subgrafului:";
cin>>nm;
cout<<"Introduceti muchiile subgrafului:";
for(int i=1;i<=nm;i++)
{
cout<<"Muchia "<<i+1<<":";
cin>>v[i].x>>v[i].y;
}
}
int verificare()
{
//Verifica daca multimea varfurilor lui G1 este inclusa
//in multimea varfurilor lui G
for(int i=1;i<=nn;i++)
if((m[i]<1)||(m[i]>n))
return 0;
//Verifica daca G1 contine muchii care nu apar in G
for(i=1;i<=nn;i++)
if(a[v[i].x][v[i].y]!=1)
return 0;
return 1;
}
void main()
{
citire_graf();
citire_subgraf();
if(verificare())
cout<<"Al doilea graf este subgraf al grafului dat.";
else
3
Algoritmica grafelor
cout<<"Al doilea graf nu este subgraf al grafului dat.";
}
Algoritmica grafelor
nr=2;
do
{
i=1;
while((i<=n)&&(nr<p))
{
int ok=0;
for(int k=1;k<=na;k++)
if(i==a[k])
ok=1;
if(ok==1)
{
j=1;
while((j<=m)&&(nr<p))
{
int ok=0;
for(int k=1;k<=nb;k++)
if(j==b[k])
ok=1;
if(ok==1)
if(v[j].x==i)
{
na++;
a[na]=v[j].y;
nr++;
k=1;
while(b[k]!=j)
k++;
for(int l=k;l<nb;l++)
b[l]=b[l+1];
nb--;
}
else
if(v[j].y==i)
{
na++;
a[na]=v[j].x;
nr++;
k=1;
while(b[k]!=j)
k++;
for(int l=k;l<nb;l++)
b[l]=b[l+1];
nb--;
}
j++;
}
}
i++;
}
}
while(nr!=p);
Algoritmica grafelor
//Adauga
subgrafului
toate
muchiile
extremitati in multimea sa de varfuri a
for(i=1;i<=m;i++)
{ int ok=0;
for(int k=1;k<=nb;k++)
if(i==b[k])
ok=1;
if(ok==1)
{
int ok1=0;
for(int z=1;z<=na;z++)
if(v[i].x==a[z])
ok1=1;
int ok2=0;
for(z=1;z<=na;z++)
if(v[i].y==a[z])
ok2=1;
if((ok1==1)&&(ok2==1))
{
k=1;
while(b[k]!=j)
k++;
for(int l=k;l<nb;l++)
b[l]=b[l+1];
nb--;
}
}
}
}
care
au
ambele
void tipar_subgraf()
{
cout<<"Varfurile subgrafului sunt:";
for(int i=1;i<=n;i++)
{
int ok=0;
for(int k=1;k<=na;k++)
if(i==a[k])
ok=1;
if(ok==1)
cout<<i<<" ";
}
cout<<"Muchiile subgrafului:";
for(i=1;i<=m;i++)
{
int ok=0;
for(int k=1;k<=nb;k++)
if(i==b[k])
ok=1;
if(ok==0)
cout<<v[i].x<<" "<<v[i].y<<endl;
}
}
6
Algoritmica grafelor
void main()
{
citire_graf();
cout<<"p=";
cin>>p;
subgraf();
tipar_subgraf();
}
Tem:
1. S se scrie un program care pentru un graf dat G cu n vrfuri i un numr
natural k, s se determine subgraful G1 cu un numr maxim de vrfuri i
cu proprietatea c orice vrf al su are gradul cel puin k. n cazul n care
problema nu are soluie s se scrie un mesaj corespunztor.
2. S se rezolve toate cele trei problemele de mai sus, ns se va folosi
reprezentarea grafurilor sub form de liste de adiacen.