Sunteți pe pagina 1din 7

Algoritmica grafelor

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";
}

2. Fie un graf neorientat G cu n vrfuri a crui matrice de adiacen se citete de


la tastatur. Mulimea m de numere ntregi reine vrfurile unui graf G1 pentru
care se citesc extremitile muchiilor de la tastatur i se construiete vectorul de
muchii. S se verifice dac G1 este subgraf a lui G.
#include<iostream.h>
struct muchie{
int x,y;
};
typedef struct muchie muchie;
int a[50][50];
muchie v[50];
int n,nm,nn;
int m[50];
void citire_graf()
{
int x,y;
cout<<"Introduceti numarul de noduri:";
cin>>n;
cout<<"Introduceti muchiile. Terminati cu introducerea
unui capat=0:";
cin>>x>>y;
2

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.";
}

3. Pentru un graf G cu n vrfuri i un numr natural p dat, s se construiasc un


subgraf al lui G avnd exact p vrfuri. Se vor preciza vrfurile i muchiile
subgrafului determinat.
Soluie: Se construiete o mulime, fie aceasta A, care iniial conine
extremitile primei muchii. Mai folosim o mulime, fie aceasta B, care iniial
conine indicii tuturor muchiilor cu excepia primeia. Se adaug treptat n A cte
un vrf y cu proprietatea c exist o muchie care trece prin y i cealalt
extremitate a acestei muchii se gsete deja n A. Pe msur ce gsim o astfel de
muchie, o scoatem din mulimea B. La sfrit se enumer vrfurile din A i
muchiile care au ambele extremiti n A.
#include<iostream.h>
struct muchie{
int x,y;
};
typedef struct muchie muchie;
int a[50],b[50];
int n,p,m,na,nb;
muchie v[100];
void citire_graf()
{
cout<<"Introduceti numarul de noduri:";
cin>>n;
cout<<"Introduceti numarul de muchii:";
cin>>m;
for(int i=1;i<=m;i++)
{
cout<<"Dati muchia cu numarul de ordine "<<i<<":";
cin>>v[i].x>>v[i].y;
}
}
void subgraf()
{ //Determina subgraful cu p varfuri
int nr,i,j;
na=2;
a[1]=v[1].x;
a[2]=v[1].y;
nb=0;
for(i=2;i<=m;i++)
{
nb++;
b[nb]=i;
}
4

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.

S-ar putea să vă placă și