You are on page 1of 19

Tema 2-Lab 3

Tema 2 pb 1 -- subgraful cu nr maxim de noduri cu gradul cel putin k


*/
#include<iostream.h>
#include<conio.h>
#define max 100

int n,k,gr[max], el[max];

struct nod
{
int val;
nod* urm;
}*g[max];

void add(int x, int y, nod* l[max])


{
nod *p,*c=new nod;
c->val=y;
c->urm=NULL;

if(!l[x])
l[x]=c;
else
{
p=l[x];
while(p->urm)
p=p->urm;
p->urm=c;
}
}

void citire()
{
cout<<"Dati n= ";
cin>>n;
cout<<"Dati k= ";
cin>>k;

int a=1,b=1;

cout<<"Dati muchiile (opriti cu 0)\n";


cin>>a>>b;

while(a && b)
{
add(a,b,g);
add(b,a,g);
gr[a]++;
gr[b]++; //incrementam gradele
cin>>a>>b;
}
}

void afis(nod* l[max], int nr)


{
int i;
nod*p;

for(i=1;i<=nr;i++)
{
cout<<i<<": ";
p=l[i];
while(p)
{
cout<<p->val<<" ";
p=p->urm;
}
cout<<"\n";
}
}

int grade(int x, nod* l[max])


{
if(el[x])
return 0;
int i, grad=0;;
nod *c;

for(i=1;i<=n;i++)
{
c=l[i];
while(c)
{
if(!el[i] && c->val==x)
grad++;
c=c->urm;
}
}
return grad;
}

int elimin()
{
int ok=1, nr=n,i;
while(ok && nr>0)
{
for(i=1;i<=n;i++)
if(grade(i,g)<k)
{
el[i]=1;
ok=0;
nr--;
}
}
if(nr>0)
return 1;
return 0;
}

void afis_subgraf(nod *l[max])


{
cout<<"\n";

int i;
nod* p;

for(i=1;i<=n;i++)
{
if(!el[i])
{
cout<<i<<": ";

p=l[i];

while(p)
{
if(!el[p->val])
cout<<p->val<<" ";

p=p->urm;
}

cout<<"\n";
}
}

int main()
{
clrscr();
citire();
afis(g,n);

if(!elimin())
cout<<"Nu exista solutii";
else
afis_subgraf(g);
/* nodurile necorespunzatoare sunt sterse doar la nivel
logic (el[max])

subgraful este doar afisat, insa e foarte usor sa-l memoram


-- cerinta nu specifica sa fie memorat

practic eliminam fiecare nod ce nu are gradul >= k


(la recalcularea gradelor nu mai numaram muchiile nodurilor sterse)
*/
getch();

return 0;
}

TEMA 2_2A

#include<iostream.h>
#include<conio.h>
#define max 100

int n,m;

struct nod
{
int val;
nod* urm;
}*l[max];

void add(int x, int y)


{
nod *p,*c=new nod;
c->val=y;
c->urm=NULL;

if(!l[x])
l[x]=c;
else
{
p=l[x];

while(p->urm)
p=p->urm;
p->urm=c;
}
}

int ok(int x, int y)


{
nod *p;
int i;

p=l[x];
while(p)
{
if(p->val==y)
return 1;
p=p->urm;
}
return 0;
}
int citire()
{
cout<<"Dati n= ";
cin>>n;

int a,b;

cout<<"Dati muchiile -- terminati cu un 0\n";


cin>>a>>b;

while(a && b)
{
add(a,b);
add(b,a);

cin>>a>>b;
}
cout<<"Dati nr de noduri ale grafului partial: ";
cin>>m;

if(n!=m)
return 0;
cout<<"Dati muchiile lui G1: (terminati cu 0)\n";
cin>>a>>b;

while(a && b)
{
if(!ok(a,b))
return 0;
cin>>a>>b;
}
return 1;
}

int main()
{
clrscr();

if(!citire())
cout<<"Graful dat nu poate fi un graf partial al lui G";
else
cout<<"Totul e ok";

getch();
return 0;
}

..............
..............
.............
.............

TEMA 2_2B
LAAAAAAAAAAAAB 3333333333333333333
#include<iostream.h>
#include<conio.h>
#define max 100

int n,aux[max];

struct nod
{
int val;
nod* urm;
}*l[max];

void add(int x, int y)


{
nod *c=new nod;
c->val=y;

if(!l[x])
{
c->urm=NULL;
l[x]=c;

}
else
{
c->urm=l[x];
l[x]=c;
}
}

void citire()
{
cout<<"Dati n= ";
cin>>n;
int a,b;
cout<<"Dati muchiile (opriti cu 0)\n";
cin>>a>>b;
while(a && b)
{
add(a,b);
add(b,a);
cin>>a>>b;
}
}
void afis()
{
int i;
nod*p;
for(i=1;i<=n;i++)
{
cout<<i<<": ";
p=l[i];
while(p)
{
cout<<p->val<<" ";
p=p->urm;
}
cout<<"\n";
}
}

int ok(int x, int y)


{
nod *p;
int i;
p=l[x];
while(p)
{
if(p->val==y)
return 1;
p=p->urm;
}
return 0;
}
int citire_sgrf()
{
int a,b;
cout<<"Dati multimea nodurilor lui G1: -- terminati cu 0 ";
cin>>a;
while(a)
{
aux[a]=1;
if(a<1||a>n)
return 0;
cin>>a;
}
cout<<"Dati muchiile lui G1: -- terminati cu 0 ";
cin>>a>>b;

while(a && b)
{
if(!aux[a]|| !aux[b])
{
cout<<"Muchia nu poate exista in G1\n";
return 0;
}
if(!ok(a,b))
return 0;
cin>>a>>b;
}
return 1;
}

int main()
{
clrscr();
citire();
afis();

if(!citire_sgrf())
cout<<"Graful dat nu poate fi subgraf al lui G ";
else
cout<<"Totul e ok";
getch();
return 0;
}

TEMA 2_2C

.
.
.
.
..

.
.

.
.
.

#include<iostream.h>
#include<conio.h>
#define max 100

// in G1 o sa avem primele p noduri din G


//(e mai usor pentru notatia nodurilor)

int n,p,m;

struct nod
{
int val;
nod* urm;
}*g[max],*g1[max];

void add(int x, int y, nod* l[max])


{
nod *c=new nod;
c->val=y;

if(!l[x])
{
c->urm=NULL;
l[x]=c;
}
else
{
c->urm=l[x];
l[x]=c;
}
}

void citire()
{
cout<<"Dati n= ";
cin>>n;
int a,b;
cout<<"Dati muchiile (opriti cu 0)\n";
cin>>a>>b;
while(a && b)
{
add(a,b,g);
add(b,a,g);
cin>>a>>b;
}
cout<<"Dati p= ", cin>>p;
}

void afis(nod* l[max], int nr)


{
int i;
nod*p;
for(i=1;i<=nr;i++)
{
cout<<i<<": ";
p=l[i];
while(p)
{
cout<<p->val<<" ";
p=p->urm;
}
cout<<"\n";
}
}

void constr()
{
nod* c;
for(int i=1;i<=p;i++)
{
c=g[i];

while(c)
{
if(i<=p && c->val<=p)
add(i,c->val,g1);
c=c->urm;
}
}
}

int main()
{
clrscr();

citire();
constr();
afis(g,n);
cout<<"\nG1:\n";
afis(g1,p);

getch();
return 0;
}
........................................................

Tema 2-Lab 4

PB 1

#include<stdio.h>
#include<conio.h>
#define max 100

int a[max][max],n, st[max],v1,v2,kmax, st2[max];

void citire()
{
freopen("matrice.txt","r",stdin);
scanf("%d%d%d",&n,&v1,&v2);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d", &a[i][j]);
}

void afis()
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}

void copiaza(int x)
{
kmax=x;
for(int i=1;i<=x;i++)
st2[i]=st[i];
}

int ok(int x,int y)


{
for(int i=1;i<y;i++)
if(st[i]==x)
return 0;
if(!a[st[y-1]][x])
return 0;
return 1;
}

void back(int k)
{
if(st[k-1]==v2 && (k-1)>kmax)
copiaza(k-1);
for(int i=1;i<=n;i++)
{
if(ok(i,k))
{
st[k]=i;
back(k+1);
}
}
}

int main()
{
clrscr();
citire();
afis();
st[1]=1;
back(2);
for(int i=1;i<=kmax;i++)
printf("%d ",st2[i]);
return 0;
}
............///////////////////////////////////////////////////////////////////////
/
Pb 2
#include<stdio.h>
#include<conio.h>
#define max 100

int a[max][max],n, st[max],v1,v2,m;

void citire()
{
printf("Dati n(numarul de varfuri), m(numarul de muchii), v1(extremitatea 1),
v2 (extremitatea 2)\n");
scanf("%d%d%d%d",&n,&m,&v1,&v2);
int a1,b1;
printf("Dati muchia: ");
for(int i=1;i<=m;i++)
{
printf("%d: ",i);
scanf("%d%d", &a1,&b1);
a[a1][b1]=a[b1][a1]=1;
}
}

void afis(int k)
{
for(int i=1;i<=k;i++)
printf("%d ",st[i]);
printf("\n");
}

int ok(int x,int y)


{
for(int i=1;i<y;i++)
if(st[i]==x)
return 0;
if(!a[st[y-1]][x])
return 0;
return 1;
}

void back(int k)
{
if(st[k-1]==v2)
afis(k-1);
for(int i=1;i<=n;i++)
{
if(ok(i,k))
{
st[k]=i;
back(k+1);
}
}
}

int main()
{
clrscr();
citire();
st[1]=1;
back(2);
getch();
return 0;
}

Pb 3

#include<stdio.h>
#include<conio.h>
#define max 100

int a[max][max],n,viz[max];

void citire()
{
int x,y;
printf("Dati n=: ");
scanf("%d",&n);
printf("Dati perechiile: (terminati cu 0 )\n");
scanf("%d%d",&x,&y);

while(x && y)
{
a[x][y]=a[y][x]=1;
scanf("%d%d",&x,&y);
}
}
void parc(int k)
{
viz[k]=1;

for(int i=1;i<=n;i++)
if(a[k][i]&& (!viz[i]))
parc(i);
}
int main()
{
clrscr();

citire();

parc(1);//incepem cu nodul 1 si parcurgem graful--doar unde avem muchii

for(int i=1;i<=n;i++)//verificam daca am ajuns in toate nodurile


if(!viz[i])
{
printf("Nu se poate ajunge oriunde de oriunde");
getch();
return 0;
}
printf("Se poate ajunge din orice localitate in orice localitate");
getch();
return 0;
}

Pb 4

#include<stdio.h>
#include<conio.h>
#define max 100

int a[max][max],n,viz[max];
void citire()
{
freopen("graf.txt","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d", &a[i][j]);
}
void afis()
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}

void parc(int k)
{
for(int i=1;i<=n;i++)
if(a[k][i])
{
viz[i]=viz[k]==1?2:1;
}
}

int main()
{
citire();
for(int i=1;i<=n;i++)
if(!viz[i])
{
viz[i]=1;
parc(i);
}
clrscr();
afis();
printf("Multimea A: ");
for(i=1;i<=n;i++)
if(viz[i]==1)
printf("%d ",i);
printf("\n");
printf("Multimea B: ");
for(i=1;i<=n;i++)
if(viz[i]==2)
printf("%d ",i);
return 0;
}

Lab 6 pb 1 -- Speologii -- componenta comunicanta

cu numar maxim de noduri

#include<iostream.h>
#include<conio.h>
#define max 100
int a[max][max],n,m,st[max],mx[max],nr_max,viz[max];
//spatiu in favoarea vitezei

void citire()
{
clrscr();

cout<<"Dati n=";
cin>>n;
cout<<"Dati nr de muchii:";
cin>>m;

int i,x,y;
cout<<"Dati arcele";

for(i=1;i<=m;i++)
{
cout<<i<<": ";
cin>>x>>y;
a[x][y]=1;
}
}

void afis()
{
cout<<"Portiunea cu numarul maxim "<<nr_max<<": ";
for(int i=1;i<=nr_max;i++)
cout<<mx[i]<<" ";
getch();
}

void parc(int k)//algoritmul se bazeaza pe parcurgere


{
if(k>nr_max) // daca lungimea drumului e mai mare decat
{ //cea a maximului curent, il retinem
nr_max=k;
for(int i=1;i<=k;i++)
{
mx[i]=st[i];
// cout<<st[i]<<" ";
}
// cout<<"\n";
}

for(int i=1;i<=n;i++)
if(a[st[k]][i] && (!viz[i]))
{
st[k+1]=i;
viz[i]=1;
parc(k+1);
}
}

void noduri()
{
for(int i=1;i<=n;i++) //pornim cu fiecare nod
{ //si vedem cat de departe ajungem
for(int j=1;j<=n;j++)
st[j]=viz[j]=0;

st[1]=i;
viz[i]=1;

parc(1);
}
}

int main()
{
citire();
noduri();
afis();
return 0;
}

Lab 6 pb 2 -- Prieteni -- componenta conexa

cu numar k de noduri

#include<iostream.h>
#include<conio.h>
#define max 100

int a[max][max],n,m,st[max],nr,k2,viz[max];

void citire()
{
clrscr();

cout<<"Dati n=";
cin>>n;
cout<<"Dati nr de muchii:";
cin>>m;

cout<<"Dati k= ";
cin>>nr;

int i,x,y;
cout<<"Dati muchiile\n";

for(i=1;i<=m;i++)
{
cout<<i<<": ";
cin>>x>>y;
a[x][y]=a[y][x]=1;
}

cout<<"Gruputile formate din "<<nr<<" persoane sunt:\n";


}

void afis()
{
cout<<"\n";

for(int i=1;i<=nr;i++)
cout<<st[i]<<" ";

void parc(int k)//algoritmul se bazeaza pe parcurgere


{

for(int i=1;i<=n;i++)
if(a[st[k]][i] && (!viz[i]))
{
k2=k+1;//retinem nr. de elemente din st[]
st[k+1]=i;
viz[i]=1;
parc(k+1);
}
if(!st[2])//pentru componentele cu un sg nod
k2=1;
}

void noduri()
{
for(int i=1;i<=n;i++) //pornim cu fiecare nod nevizitat
{ //si vedem cate elemente exista in componenta conexa

if(!viz[i])
{
for(int j=1;j<=n;j++)
st[j]=0;

st[1]=i;
viz[i]=1;

parc(1);

if(k2==nr)
afis();
}
}
}

int main()
{
citire();
noduri();
getch();
return 0;
}
Pb 5

#include<stdio.h>
#include<conio.h>
#define max 100
int n,a[max][max],viz[max],ind,t[max];
void citire()
{
int x,y;
printf("Dat muchiile: -terminati cu 0-\n");
scanf("%d%d",&x,&y);

while(x&&y)
{
if(x>n)
n=x;
if(y>n)
n=y;

a[x][y]=a[y][x]=1;
scanf("%d%d",&x,&y);
}
}

void parc(int k)//o simpla parcurgere


{
if(!ind)
{
viz[k]=1;
for(int i=1;i<=n;i++)
if(a[k][i])
if(!viz[i])
{
t[i]=k;
parc(i);
}
else
if(t[k]!=i)//verificam sa nu ne intoarcem cu aceeasi muchie
ind=1;//am gasit un ciclu
}
}

int main()
{
clrscr();
citire();

for(int i=1;i<=n && (!ind);i++)


{
for(int j=1;j<=n;j++)
viz[j]=t[j]=0;
parc(i);
}
if(!ind)
printf("Graful nu contine cicluri");
else
printf("Graful contine cicluri");
getch();
return 0;
}

Pb 6

#include<stdio.h>
#include<conio.h>
#define max 100

int a[max][max],n,viz[max],ind;

void citire()
{
freopen("graf.txt","r",stdin);

scanf("%d",&n);

for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d", &a[i][j]);

void afis()
{
int i,j;

for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d ",a[i][j]);
printf("\n");
}

void parc(int k)
{
if(!ind)
{

for(int i=1;i<=n && (!ind);i++)


if(a[k][i])
{
if(viz[i])
{
if(viz[i]==viz[k])
ind=1;
}
else
viz[i]=viz[k]==1?2:1;
}
}
}

int main()
{
clrscr();

citire();

for(int i=1;i<=n && (!ind);i++)


{ if(!viz[i])

viz[i]=1;
parc(i);

afis();

if(ind)
printf("Graful nu este bipartit");
else
{

printf("Graful este bipartit\n");

printf("Multimea A: ");
for(i=1;i<=n;i++)
if(viz[i]==1)
printf("%d ",i);

printf("\n");

printf("Multimea B: ");
for(i=1;i<=n;i++)
if(viz[i]==2)
printf("%d ",i);

return 0;
}

You might also like