Sunteți pe pagina 1din 84

Portofoliu

Informatica
Elev :Duman Ionut Alex

1.Coada dinamica
#include<iostream>
using namespace std;
const int Nmax=50;
int c[Nmax], inc=1, sf=0, X,n ;
typedef struct nod
{
int info;
nod *urm;
}
void creare()
{
TNOD *
cin>>n;
int i=1;
while(i<=n&&sf!=Nmax)
{
sf++; cin>>c[sf];i++;
}
}
void afisare(int c[],int inc,int sf)
{
for(int i=inc;i<=sf;i++)cout<<c[i]<<" ";
}
int main()
{
creare();
afisare(c,inc,sf);
return 0;
}
2.Scrieti un program care in mod repetat realizeaza una dintre urmatoarele
operatii asupra unei cozi: inserarea unui element,extragerea sau afisarea unui
element.
#include<iostream>
using namespace std;
const int Nmax=50;
int main()
{

int c[Nmax], inc=1, sf=0, X, opt;


cout<<"1: Pentru inserare"<<endl<<"2:Pentru extragere"<<endl<<"3:Pentru
afisare"<<endl<<"0: iesire"<<endl;
do{
cin>>opt;
switch(opt)
{
case 1: if(sf==Nmax)cout<<"coada plina";
else {sf++; cin>>c[sf];} break;
case 2: if(inc>sf)cout<<"coada vida";
else {X=c[inc]; inc++;} cout<<endl;break;
case 3: for(int i=inc;i<=sf;i++)cout<<c[i]<<" ";cout<<endl; break;
}}while(opt!=0);
return 0;
}
3. Sa se creeze o coada care contine elementele prime ale unei cozi deja
existente
#include<iostream>
using namespace std;
const int Nmax=50;
int c[Nmax], inc=1, sf=0, X,n,d[Nmax],inc2=1,sf2=0;
void creare()
{
cin>>n;
int i=1;
while(i<=n&&sf!=Nmax)
{
sf++; cin>>c[sf];i++;
}
}
int prim(int n)
{
int d;
for(d=2;d<=n/2;d++)if(n%d==0)return 0;
return 1;
}
void creare2()
{
int i=1;
while(i<=n&&sf!=Nmax)
{
if(prim(c[i])==1){sf2++;d[sf2]=c[i];}
i++;
}
}

void afisare(int c[],int inc,int sf)


{
for(int i=inc;i<=sf;i++)cout<<c[i]<<" ";
}
int main()
{
creare();
creare2();
afisare(c,inc,sf);
cout<<endl;
afisare(d,inc2,sf2);
return 0;
}
4. Fiind data o lista liniara simplu inlantuita sa se determine suma elementelor
din lista cu proprietatea ca sunt numere perfecte sau palindroame
#include<iostream>
using namespace std;
typedef struct nod
{
int info;
nod *urm;
}TNOD;
TNOD* creare()
{
TNOD *prim,*ultim,*nou;
int n,i;
cin>>n;
prim=new TNOD;
cin>>prim->info;
prim->urm=NULL;
ultim=prim;
for(i=2;i<=n;i++)
{
nou=new TNOD;
cin>>nou->info;
nou->urm=NULL;
ultim->urm=nou;
ultim=nou;
}
return prim;
}
int palindrom(int x)
{

int c,inv=0;
c=x;
while(c!=0){
inv=inv*10+c%10;
c=c/10;
}
if(inv==x) return 1;
else return 0;
}
int perfect(int x)
{
int d,sd=0;
for(d=1;d<=x/2;d++) if(x%d==0) sd=sd+d;
if(sd==x)return 1;
else return 0;
}
void afisare(TNOD *prim)
{
int s=0;
TNOD *p;
p=prim;
while(p){
if(perfect(p->info)||palindrom(p->info))s=s+p->info;
p=p->urm;
}
cout<<s;
}
int main()
{
TNOD *L;
L=creare();
afisare(L);
}

5. Se da o lista liniara simplu inlantuita. Sa se stearga elementele care sunt


numere perfecte
#include<iostream>
using namespace std;
typedef struct nod
{
int info;
nod *urm;
}TNOD;

TNOD* creare()
{
TNOD *prim,*nou,*ultim;
int n,i;
cin>>n;
prim=new TNOD;
cin>>prim->info;
prim->urm=NULL;
ultim=prim;
for(i=2;i<=n;i++) {
nou=new TNOD;
cin>>nou->info;
nou->urm=NULL;
ultim->urm=nou;
ultim = nou;
}
return prim;
}
int perfect(int x)
{
int s=1,d;
for(d=2;d<=x/2;d++)if(x%d==0)s=s+d;
if(s==x)return 1;
else return 0;
}
void stergere(TNOD *p)
{
TNOD *q;
while(p->urm)
{
if(perfect(p->info)==1)
{
q->urm=p->urm;
}
q=p;
p=p->urm;
}
}
TNOD *sterg1(TNOD *p)
{
if(perfect(p->info)==1)p=p->urm;
return p;
}
void sterg2(TNOD *p)
{
while(p->urm->urm)p=p->urm;

if(perfect(p->urm->info)==1)p->urm=NULL;
}
void afisare(TNOD *p)
{
while(p)
{
cout<<p->info<<" ";
p=p->urm;
}
}
int main()
{
TNOD *p;
p=creare();
p=sterg1(p);
sterg2(p);
stergere(p);
afisare(p);
return 0;
}
6.//Scrieti o functie care primeste ca parametrii 2 pointeri catre primul si ultimul
nod ai unei liste liniare dublu inlantuite si determina perechile de noduri ale listei
cu proprietatea ca au aceeasi suma a cifrelor
#include<iostream>
using namespace std;
typedef struct nod
{
int info;
nod *urm,*prec;
}TNOD;
TNOD *prim,*ultim;
void creare()
{
TNOD *nou;
int i,n;
cin>>n;
prim=new TNOD;
ultim=new TNOD;
prim->urm=ultim;
prim->prec=NULL;
ultim->urm=NULL;

ultim->prec=prim;
for(i=1;i<=n;i++){
nou=ultim;
cin>>nou->info;
ultim=new TNOD;
ultim->urm=NULL;
nou->urm=ultim;
ultim->prec=nou;
}
}
int suma(int x)
{
int s=0;
while(x!=0) {s=s+x%10;x=x/10;}
return s;
}
void chestie_nasoala()
{
TNOD *p,*pp;
p=prim->urm;
while(p!=ultim)
{
pp=p->urm;
while(pp!=ultim) {
if(suma(p->info)==suma(pp->info)) cout<<p->info<<" "<<pp>info<<endl;
pp=pp->urm;
}
p=p->urm;
}
}
void afisare()
{
TNOD*p;
p=prim->urm;
while(p!=ultim){
cout<<p->info<<" ";
p=p->urm;
}
}
int main()
{

creare();
chestie_nasoala();
return 0;
}
7.//Se da o lista liniara simplu inlantuita. Sa se insereze dupa fiecare numar prim
dublu valorii respective
#include<iostream>
using namespace std;
typedef struct nod
{
int info;
nod *urm;
}TNOD;
TNOD* creare()
{
TNOD *prim,*ultim,*nou;
int n,i;
cin>>n;
prim=new TNOD;
cin>>prim->info;
prim->urm=NULL;
ultim=prim;
for(i=2;i<=n;i++)
{
nou=new TNOD;
cin>>nou->info;
nou->urm=NULL;
ultim->urm=nou;
ultim=nou;
}
return prim;
}
int nrprim(int x)
{
int d;
for(d=2;d<=x/2;d++) if(x%d==0) return 0;
return 1;
}
void afisare(TNOD *prim)
{
TNOD *p;

p=prim;
while(p){
cout<<p->info<<" ";
p=p->urm;
}
}
TNOD* inserare(TNOD *prim)
{
TNOD *p,*nou,*q;
int c;
p=prim;
while(p)
{
if(nrprim(p->info)){
nou=new TNOD;
nou->info=2*p->info;
nou->urm=p->urm;
p->urm=nou;
p=p->urm;
}
p=p->urm;
}
return prim;
}
int main()
{
TNOD *L;
L=creare();
L=inserare(L);
afisare(L);
}

8.// Se da o lista liniara simplu inlantuita. Sa se transforme toate literele in


majuscule si sa se inlocuiasca fiecare vocala cu litera imediat corespunzatoare
din alfabet. Sa se afiseze lista inainte si dupa modificari.
#include<iostream>
#include<ctype.h>
using namespace std;
typedef struct nod
{
char info;
nod *urm;
}TNOD;

TNOD *prim,*nou,*ultim;
TNOD* creare()
{
int n,i;
cin>>n;
prim=new TNOD;
cin>>prim->info;
prim->urm=NULL;
ultim=prim;
for(i=2;i<=n;i++) {
nou=new TNOD;
cin>>nou->info;
nou->urm=NULL;
ultim->urm=nou;
ultim = nou;
}
return prim;
}
void afisare(TNOD *p)
{
while(p)
{
cout<<p->info<<" ";
p=p->urm;
}
}
void functie_char(TNOD *p)
{
p=prim;
while(p)
{
if(p->info=='a') p->info=p->info + 1;
if(p->info=='e') p->info=p->info + 1;
if(p->info=='i') p->info=p->info + 1;
if(p->info=='o') p->info=p->info + 1;
if(p->info=='u') p->info=p->info + 1;
p->info=toupper(p->info);
p=p->urm;
}
}
int main()
{
TNOD *L;

L=creare();
afisare(L);
cout<<endl;
functie_char(L);
afisare(L);
return 0;
}

9.// Sa se creeze o lista liniara dublu inlantuita cu primii n termeni ai sirului


Fibonacci.
#include<iostream>
using namespace std;
typedef struct nod
{
int info;
nod *prec,*urm;
}TNOD;
TNOD *prim,*ultim;
void creare()
{
TNOD *nou;
int i,n;
cin>>n;
prim=new TNOD;
ultim = new TNOD;
prim->urm=ultim;
prim->prec=NULL;
ultim->urm=NULL;
ultim->prec=prim;
nou=ultim;
nou->info=1;
ultim = new TNOD;
nou->urm = ultim;
ultim->prec = nou;
ultim->urm = NULL;
nou=ultim;
nou->info=1;
ultim = new TNOD;
nou->urm = ultim;
ultim->prec = nou;
ultim->urm = NULL;
for(i=3;i<=n;i++){
nou=ultim;

nou->info=ultim->prec->info+ultim->prec->prec->info;
ultim = new TNOD;
nou->urm = ultim;
ultim->prec = nou;
ultim->urm = NULL;
}
}
void afisare(TNOD *prec, TNOD *urm)
{
TNOD *p;
p=prim->urm;
while(p!=ultim)
{
cout<<p->info<<" ";
p=p->urm;
}
}

int main()
{
creare();
afisare(prim,ultim);
return 0;
}

11.// Fisierul nr.txt contine un sir de numere naturale. Sa se construiasca o lista


circulara ale carei noduri sa contina drept informatii utile elementele din fisier
apoi sa se scrie o functie care sa retina media aritmetica a numerelor prime din
lista
#include<iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
typedef struct nod
{
int info;
nod *urm;
}TNOD;
TNOD* creare()
{
TNOD *prim,*nou,*ultim;

int i,x;
prim=new TNOD;
f>>prim->info;
prim->urm=NULL;
ultim=prim;
while(f>>x) {
nou=new TNOD;
nou ->info=x;
nou -> urm = NULL;
ultim->urm=nou;
ultim=nou;
}
ultim->urm=prim;
return prim;
}
void afisare(TNOD *p)
{
TNOD *pp;
pp=p;
do
{
cout<<pp->info<<" ";
pp=pp->urm;
}while(pp!=p);
cout<<p->info;
}
float prim(TNOD *p)
{
int d,sem;
int nr=0,s=0;
TNOD *pp;
pp=p;
do
{
sem=1;
for(d=2;d<=p->info/2;d++)if(p->info%d==0)sem=0;
if(sem==1){nr++;s=s+p->info;}
p=p->urm;
}while(p!=pp);
sem=1;
for(d=2;d<=p->info/2;d++)if(p->info%d==0)sem=0;
if(sem==1){nr++;s=s+p->info;}
return float(s)/nr;

}
int main()
{
TNOD *L;
L=creare();
cout<<prim(L)<<endl;
afisare(L);
return 0;
}

12.Liste stiva
#include<iostream>
using namespace std;
typedef struct nod
{
int info;
nod *urm;
}TNOD;

TNOD* creare()
{
TNOD *vf, *nou;
int i,n;
cin>>n;
vf=new TNOD;
cin>>vf->info;
vf->urm=NULL;
for(i=2;i<=n;i++)
{
nou=new TNOD;
cin>>nou->info;
nou->urm=vf;
vf=nou;
}
return vf;
}

void afisare(TNOD *p)


{
while(p!=NULL){
cout<<p->info<<" ";

p=p->urm;
}
}

int main()
{
TNOD *p;
p=creare();
afisare(p);
return 0;
}

13.//Se da o stiva alocata dinamic.Sa se creeze o stiva ce contine numerele pare


din stiva initiala si alta ce contine numerele impare.
#include<iostream>
using namespace std;
typedef struct nod
{
int info;
nod *urm;
}TNOD;

TNOD *vf, *nou;


TNOD* creare()
{
int i,n;
cin>>n;
vf=new TNOD;
cin>>vf->info;
vf->urm=NULL;
for(i=2;i<=n;i++)
{
nou=new TNOD;
cin>>nou->info;
nou->urm=vf;
vf=nou;
}
return vf;
}

TNOD* creare_par(TNOD *p)


{
TNOD *vf1;
vf1=new TNOD;
vf1->urm=NULL;
while(p!=NULL){
if(p->info%2==0)
{
nou=new TNOD;
nou->info=p->info;
nou->urm=vf1;
vf1=nou;
}
p=p->urm;
}
return vf1;
}

TNOD* creare_impar(TNOD *p)


{
TNOD *vf2;
vf2=new TNOD;
vf2->urm=NULL;
while(p!=NULL){
if(p->info%2!=0)
{
nou=new TNOD;
nou->info=p->info;
nou->urm=vf2;
vf2=nou;
}
p=p->urm;
}
return vf2;
}

void afisare(TNOD *p)


{
while(p!=NULL){
cout<<p->info<<" ";

p=p->urm;
}
}
int main()
{
TNOD *p,*par,*impar;
p=creare();
par=creare_par(p);
impar=creare_impar(p);
afisare(par);
cout<<endl;
afisare(impar);
return 0;
}
14.//Se da o stiva alocata dinamic.Sa se creeze o stiva ce contine numere prime
din stiva initiala.
#include<iostream>
using namespace std;
typedef struct nod
{
int info;
nod *urm;
}TNOD;

TNOD *vf, *nou;


TNOD* creare()
{
int i,n;
cin>>n;
vf=new TNOD;
cin>>vf->info;
vf->urm=NULL;
for(i=2;i<=n;i++)
{
nou=new TNOD;
cin>>nou->info;
nou->urm=vf;
vf=nou;
}
return vf;

}
int prim(int x)
{
int c=0,i;
for(i=1;i<=x;i++) if(x%i==0) c++;
if(c==2) return 1;
return 0;
}

TNOD* creare_prim(TNOD *p)


{
TNOD *vf1;
vf1=new TNOD;
vf1->urm=NULL;
while(p!=NULL){
if(prim(p->info)==1)
{
nou=new TNOD;
nou->info=p->info;
nou->urm=vf1;
vf1=nou;
}
p=p->urm;
}
return vf1;
}

void afisare(TNOD *p)


{
while(p!=NULL){
cout<<p->info<<" ";
p=p->urm;
}
}
int main()
{
TNOD *p,*pr;
p=creare();
pr=creare_prim(p);
afisare(pr);
return 0;
}

15.Lista liniara dublu inlantuita


#include<iostream>
using namespace std;
typedef struct nod
{
int info;
nod *prec,*urm;
}TNOD;
TNOD *prim,*ultim;
void creare()
{
TNOD *nou;
int i,n;
cin>>n;
prim=new TNOD;
ultim = new TNOD;
prim->urm=ultim;
prim->prec=NULL;
ultim->urm=NULL;
ultim->prec=prim;
for(i=1;i<=n;i++){
nou=ultim;
cin>>nou->info;
ultim = new TNOD;
nou->urm = ultim;
ultim->prec = nou;
ultim->urm = NULL;
}
}
void afisare_normala_st_dr(TNOD *prec, TNOD *urm)
{
TNOD *p;
p=prim->urm;
while(p!=ultim)
{
cout<<p->info<<" ";
p=p->urm;
}
}

int main()
{

creare();
afisare(prim,ultim);
return 0;
}

16.//Se citeste de la tastatura un sir de maxim 80 de caractere. Sa se creeze o


lista linara dublu inlantuita in care fiecare nod va avea ca informatie utile un
caracter al sirului.

#include<iostream>
#include<string.h>
using namespace std;
typedef struct nod
{
char info;
nod *prec,*urm;
}TNOD;
TNOD *prim,*ultim;
void creare()
{
char s[81];
cin.get(s,81);
TNOD *nou;
int i,n;
n=strlen(s);
prim=new TNOD;
ultim = new TNOD;
prim->urm=ultim;
prim->prec=NULL;
ultim->urm=NULL;
ultim->prec=prim;
for(i=0;i<=n;i++){
nou=ultim;
nou->info=s[i];
ultim = new TNOD;
nou->urm = ultim;
ultim->prec = nou;
ultim->urm = NULL;
}
}
void afisare(TNOD *prec, TNOD *urm)

{
TNOD *p;
p=prim->urm;
while(p!=ultim)
{
cout<<p->info<<" ";
p=p->urm;
}
}

int main()
{
creare();
afisare(prim,ultim);
return 0;
}

17.// Sa se creeze o lista dublu inlantuita in care fiecare nod contine ca informatie
utila un carcater al unui sir citit din fisier. Sa se afiseze literele distincte din sir
impreuna cu frecventa lor de aparitie
#include<iostream>
#include<string.h>
using namespace std;
typedef struct nod
{
char info;
nod *urm,*prec;
} TNOD;
TNOD *prim,*ultim;
void creare()
{
TNOD *nou;
int n,i; char s[80];
cin.get(s,80);
prim=new TNOD;
ultim=new TNOD;
prim->urm=ultim;
prim->prec=NULL;
ultim->prec=prim;
ultim->urm=NULL;
n=strlen(s);
for(i=0;i<n;i++)
{
nou=ultim;

nou->info=s[i];
ultim=new TNOD;
nou->urm=ultim;
ultim->prec=nou;
ultim->urm=NULL;
}
}
void verificare(TNOD *prim,TNOD *ultim)
{
char i; int nr=0;
TNOD *p;
for(i='a';i<='z';i++)
{
nr=0;
p=prim->urm;
while(p!=ultim)
{
if(p->info==i) nr++;
p=p->urm;
}
if(nr!=0) cout<<i<<" "<<nr<<endl;
}
}
int main()
{
creare();
verificare(prim,ultim);
return 0;
}

18.Fiind data o lista dublu inlantuita, sa se insereze dupa ficare element negativ
al listei valoarea 0 apoi sa se afiseze lista.
#include<iostream>
using namespace std;
typedef struct nod
{
int info;
nod *prec,*urm;
}TNOD;

TNOD *prim,*ultim;

void creare()
{
TNOD *nou;
int i,n;
cin>>n;
prim=new TNOD;
ultim = new TNOD;
prim->urm=ultim;
prim->prec=NULL;
ultim->urm=NULL;
ultim->prec=prim;
for(i=1;i<=n;i++){
nou=ultim;
cin>>nou->info;
ultim = new TNOD;
nou->urm = ultim;
ultim->prec = nou;
ultim->urm = NULL;
}
}
void inserare()
{
TNOD *p,*nou;
p=prim->urm;
while(p!=ultim) {
if(p->info<0){
nou=new TNOD;
nou->info=0;
nou->urm=p->urm;
nou->prec=p->prec;
p->urm=nou;
}
p=p->urm;
}
}
void afisare(TNOD *prec, TNOD *urm)
{
TNOD *p;
p=prim->urm;
while(p!=ultim)
{
cout<<p->info<<" ";
p=p->urm;
}

int main()
{
creare();
inserare();
afisare(prim,ultim);
return 0;
}

19.// Se da o lista liniara dublu inlantuita. Sa se insereze un numar la inceputul


listei
#include<iostream>
using namespace std;
typedef struct nod
{
int info;
nod *prec,*urm;
}TNOD;

TNOD *prim,*ultim;

void creare()
{
TNOD *nou;
int i,n;
cin>>n;
prim=new TNOD;
ultim = new TNOD;
prim->urm=ultim;
prim->prec=NULL;
ultim->urm=NULL;
ultim->prec=prim;
for(i=1;i<=n;i++){
nou=ultim;
cin>>nou->info;
ultim = new TNOD;
nou->urm = ultim;
ultim->prec = nou;
ultim->urm = NULL;

}
}
void inserare()
{
TNOD *nou;
nou=new TNOD;
cin>>nou->info;
nou->urm=prim->urm;
nou->prec=prim;
prim->urm=nou;
}
void afisare(TNOD *prec, TNOD *urm)
{
TNOD *p;
p=prim->urm;
while(p!=ultim)
{
cout<<p->info<<" ";
p=p->urm;
}
}

int main()
{
creare();
inserare();
afisare(prim,ultim);
return 0;
}

20.Lista liniara dublu inlantuita inserare k.


#include<iostream>
using namespace std;
typedef struct nod
{
int info;
nod *prec,*urm;
}TNOD;

TNOD *prim,*ultim;

void creare()
{
TNOD *nou;
int i,n;
cin>>n;
prim=new TNOD;
ultim = new TNOD;
prim->urm=ultim;
prim->prec=NULL;
ultim->urm=NULL;
ultim->prec=prim;
for(i=1;i<=n;i++){
nou=ultim;
cin>>nou->info;
ultim = new TNOD;
nou->urm = ultim;
ultim->prec = nou;
ultim->urm = NULL;
}
}
void inserare(TNOD *prim)
{
int k;
TNOD *q,*nou;
cin>>k;
q=prim;
for(int i=1;i<=k-1;i++) q=q->urm;
nou=new TNOD;
cin>>nou->info;
nou->urm=q->urm;
q->urm=nou;
}
void afisare(TNOD *prec, TNOD *urm)
{
TNOD *p;
p=prim->urm;
while(p!=ultim)
{
cout<<p->info<<" ";
p=p->urm;
}
}

int main()
{
creare();
inserare(prim);
afisare(prim,ultim);
return 0;
}
21.Lldi inserare sfarsit
#include<iostream>
using namespace std;
typedef struct nod
{
int info;
nod *prec,*urm;
}TNOD;

TNOD *prim,*ultim;

void creare()
{
TNOD *nou;
int i,n;
cin>>n;
prim=new TNOD;
ultim = new TNOD;
prim->urm=ultim;
prim->prec=NULL;
ultim->urm=NULL;
ultim->prec=prim;
for(i=1;i<=n;i++){
nou=ultim;
cin>>nou->info;
ultim = new TNOD;
nou->urm = ultim;
ultim->prec = nou;
ultim->urm = NULL;
}
}
void inserare()
{

TNOD *nou;
nou=new TNOD;
cin>>nou->info;
nou->prec=ultim->prec;
ultim->prec->urm=nou;
nou->urm=ultim;
ultim->prec=nou;
}
void afisare(TNOD *prec, TNOD *urm)
{
TNOD *p;
p=prim->urm;
while(p!=ultim)
{
cout<<p->info<<" ";
p=p->urm;
}
}

int main()
{
creare();
inserare();
afisare(prim,ultim);
return 0;
}

22.// Un fisier contine mai multe numere intregi. Sa se creeze si afiseze o lista
liniara dublu inlantuita in care sa se introduca numai valorile pare
#include<iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");

typedef struct nod


{
int info;
nod *prec,*urm;
}TNOD;
TNOD *prim,*ultim;

void creare()
{
TNOD *nou;
int i,n;
prim=new TNOD;
ultim = new TNOD;
prim->urm=ultim;
prim->prec=NULL;
ultim->urm=NULL;
ultim->prec=prim;
while(!f.eof()) {
f>>n;
if(n%2==0){
nou=ultim;
nou->info=n;
ultim = new TNOD;
nou->urm = ultim;
ultim->prec = nou;
ultim->urm = NULL;
}
}
}
void afisare_normala_st_dr(TNOD *prec, TNOD *urm)
{
TNOD *p;
p=prim->urm;
while(p!=ultim)
{
cout<<p->info<<" ";
p=p->urm;
}
}

int main()
{
creare();
afisare_normala_st_dr(prim,ultim);
return 0;
}

23.// Se da o lista liniara dublu inlantuita care contine numai cifre. Sa se scrie o
functie care primeste ca parametrii 2 pointeri ( prim si ultim ) si care verifica daca
informatiile utile ale listei alcatuiesc un palindrom
#include<iostream>
using namespace std;
typedef struct nod
{
int info;
nod *prec,*urm;
}TNOD;
TNOD *prim,*ultim;
void creare()
{
TNOD *nou;
int i,n;
cin>>n;
prim=new TNOD;
ultim = new TNOD;
prim->urm=ultim;
prim->prec=NULL;
ultim->urm=NULL;
ultim->prec=prim;
for(i=1;i<=n;i++){
nou=ultim;
cin>>nou->info;
ultim = new TNOD;
nou->urm = ultim;
ultim->prec = nou;
ultim->urm = NULL;
}
}
void afisare(TNOD *prec, TNOD *urm)
{
TNOD *p;
p=prim->urm;
while(p!=ultim)
{
cout<<p->info<<" ";
p=p->urm;
}
}
int functia_mama(TNOD *prim,TNOD *ultim)
{

TNOD *p;
p=prim->urm;
TNOD *q;
q=ultim->prec;
int sem=1;
while(p!=q)
{
if(p->info!=q->info) sem=0;
p=p->urm;
q=q->prec;
}
return sem;
}
int main()
{
creare();
cout<<functia_mama(prim,ultim);
//afisare(prim,ultim);
return 0;
}
24.// LLDI se introduce 0 dupa fiecare patrat perfect.
#include<iostream>
#include<math.h>
using namespace std;
typedef struct nod
{
int info;
nod *prec,*urm;
}TNOD;

TNOD *prim,*ultim;

void creare()
{
TNOD *nou;
int i,n;
cin>>n;
prim=new TNOD;
ultim = new TNOD;
prim->urm=ultim;
prim->prec=NULL;
ultim->urm=NULL;

ultim->prec=prim;
for(i=1;i<=n;i++){
nou=ultim;
cin>>nou->info;
ultim = new TNOD;
nou->urm = ultim;
ultim->prec = nou;
ultim->urm = NULL;
}
}
void inserare(TNOD *p)
{
TNOD *nou;
nou=new TNOD;
nou->info=0;
nou->urm=p->urm;
nou->prec=p->prec;
p->urm=nou;
}
void verificare()
{
TNOD *p;
float c;
p=prim->urm;
while(p!=ultim) {
c=sqrt(p->info);
if(p->info/c==c) inserare(p);
p=p->urm;
}
}
void afisare(TNOD *prec, TNOD *urm)
{
TNOD *p;
p=prim->urm;
while(p!=ultim)
{
cout<<p->info<<" ";
p=p->urm;
}
}

int main()

{
creare();
verificare();
afisare(prim,ultim);
return 0;
}

25.// Se considera o lista liniara dubla inlantuita. Sa se scrie o functie care sterge
nodul cu numarul de ordine k.
#include<iostream>
using namespace std;
typedef struct nod
{
int info;
nod *prec,*urm;
}TNOD;
TNOD *prim,*ultim;
void creare()
{
TNOD *nou;
int i,n;
cin>>n;
prim=new TNOD;
ultim = new TNOD;
prim->urm=ultim;
prim->prec=NULL;
ultim->urm=NULL;
ultim->prec=prim;
for(i=1;i<=n;i++){
nou=ultim;
cin>>nou->info;
ultim = new TNOD;
nou->urm = ultim;
ultim->prec = nou;
ultim->urm = NULL;
}
}
void afisare(TNOD *prec, TNOD *urm)
{
TNOD *p;
p=prim->urm;
while(p!=ultim)
{

cout<<p->info<<" ";
p=p->urm;
}
}

void stergere(TNOD *prim)


{
TNOD *q,*p;
int k,i;
cin>>k;
p=prim->urm;
for(i=1;i<=k-2;i++) p=p->urm;
p->urm=p->urm->urm;
p->urm->urm->prec=p;
delete q;
}

int main()
{
creare();
stergere(prim);
afisare(prim,ultim);
return 0;
}
26.Lldi stergerea prim
#include<iostream>
using namespace std;
typedef struct nod
{
int info;
nod *prec,*urm;
}TNOD;
TNOD *prim,*ultim;
void creare()
{
TNOD *nou;
int i,n;
cin>>n;
prim=new TNOD;
ultim = new TNOD;
prim->urm=ultim;
prim->prec=NULL;

ultim->urm=NULL;
ultim->prec=prim;
for(i=1;i<=n;i++){
nou=ultim;
cin>>nou->info;
ultim = new TNOD;
nou->urm = ultim;
ultim->prec = nou;
ultim->urm = NULL;
}
}
void afisare(TNOD *prec, TNOD *urm)
{
TNOD *p;
p=prim->urm;
while(p!=ultim)
{
cout<<p->info<<" ";
p=p->urm;
}
cout<<endl;
}
void stergere(TNOD *prim,TNOD *ultim)
{
TNOD *p;
p=prim->urm->urm;
p->prec=prim;
prim->urm=p;
}

int main()
{
creare();
afisare(prim,ultim);
stergere(prim,ultim);
afisare(prim,ultim);
return 0;
}

27.Lldi stergere ultim


#include<iostream>
using namespace std;

typedef struct nod


{
int info;
nod *prec,*urm;
}TNOD;
TNOD *prim,*ultim;
void creare()
{
TNOD *nou;
int i,n;
cin>>n;
prim=new TNOD;
ultim = new TNOD;
prim->urm=ultim;
prim->prec=NULL;
ultim->urm=NULL;
ultim->prec=prim;
for(i=1;i<=n;i++){
nou=ultim;
cin>>nou->info;
ultim = new TNOD;
nou->urm = ultim;
ultim->prec = nou;
ultim->urm = NULL;
}
}
void afisare(TNOD *prec, TNOD *urm)
{
TNOD *p;
p=prim->urm;
while(p!=ultim)
{
cout<<p->info<<" ";
p=p->urm;
}
cout<<endl;
}
void stergere(TNOD *prim,TNOD *ultim)
{
TNOD *p;
p=ultim->prec->prec;
p->urm=ultim;
ultim->prec=p;
}

int main()
{
creare();
afisare(prim,ultim);
stergere(prim,ultim);
afisare(prim,ultim);
return 0;
}
28.Afisarea muchiilor grafului neorientat
#include <iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int a[100][100],n,i,j;
void citire(){
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) f>>a[i][j];}
int main(){
f>>n;
citire();
for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i<j) if(a[i][j]==1) cout<<i<<"
"<<j<<endl;
return 0;}

29. Sa se determine varful de grad maxim al unui graf neorientat.


#include<iostream.h>
#include<fstream.h>
ifstream f("date.in");
int a[50][50],i,j,m,n;
void creare(int n)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>a[i][j];
}
void maxim()
{
int c[50],k=0,max=-32000,s;
for(i=1;i<=n;i++)
{
s=0;
for(j=1;j<=n;j++)

if(a[i][j]==1) s++;
k++;
c[k]=s;
}
for(i=1;i<=k;i++)
if(c[i]>max) max=c[i];
for(i=1;i<=k;i++)
if(c[i]==max) cout<<c[i]<<" ";
}
int main()
{
f>>n;
creare(n);
maxim();
return 0;
}

30.Sa se determine varfurile terminale ale unui graf.


#include<iostream.h>
#include<fstream.h>
ifstream f("date.in");
int a[50][50],i,j,m,n;
void creare(int n)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>a[i][j];
}
void terminal()
{
int s;
for(i=1;i<=n;i++)
{
s=0;
for(j=1;j<=n;j++)
if(a[i][j]==1) s++;
if(s==1) cout<<"Varful "<<i<<" este varf terminal.\n";
}
}
int main()
{
f>>n;
creare(n);
terminal();

return 0;
}

31.Sa se determine varfurile izolate ale unui graf.


#include<iostream.h>
#include<fstream.h>
ifstream f("date.in");
int a[50][50],i,j,m,n;
void creare(int n)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>a[i][j];
}
void izolat()
{
int s;
for(i=1;i<=n;i++)
{
s=0;
for(j=1;j<=n;j++)
if(a[i][j]==1) s++;
if(s==0) cout<<"Varful "<<i<<" este varf izolat.\n";
}
}
int main()
{
f>>n;
creare(n);
izolat();
return 0;
}
32.Calculati suma gradelor nodurilor impare ale grafului.
#include<iostream.h>
#include<fstream.h>
ifstream f("date.in");
int a[50][50],i,j,m,n;
void creare(int n)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>a[i][j];
}

void verf()
{
int s;
for(i=1;i<=n;i++)
{
s=0;
for(j=1;j<=n;j++)
if(i%2!=0) if(a[i][j]==1) s++;
if(i%2!=0) cout<<s<<" ";
}
}
int main()
{
f>>n;
creare(n);
verf();
return 0;
}

33.Sa se afiseze pentru un vrf dat vrfurile adiacente.


#include<iostream.h>
#include<fstream.h>
ifstream f("date.in");
int a[50][50],i,j,m,n,x;
void creare(int n)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>a[i][j];
}
void adiacente(int x)
{
for(j=1;j<=n;j++)
if(a[x][j]==1) cout<<j<<" ";
}
int main()
{
f>>n;
cin>>x;
creare(n);
adiacente(x);
return 0;
}

34.Sa se memoreze un graf neorientat folosind vectorul de muchii.


#include<iostream>
using namespace std;
typedef struct
{
int st,dr;
} TMUCHIE;
TMUCHIE v[30];
int i,j,a[50][50];
int main()
{
int n,m,i;
cin>>n>>m;
for(i=1;i<=m;i++)
do
{
cin>>v[i].st>>v[i].dr;
} while(v[i].st<1 || v[i].st>n && v[i].dr<1 || v[i].dr>n);
return 0;
}

35.#include<iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int a[50][50],i,j,n;
void citire(int n)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>a[i][j];
}
int izolat()
{
int s;
for(i=1;i<=n;i++)
{
s=0;
for(j=1;j<=n;j++)
if(a[i][j]==1) s++;
if(s==0) return 1;
}
}
int terminal()

{
int s;
for(i=1;i<=n;i++)
{
s=0;
for(j=1;j<=n;j++)
if(a[i][j]==1) s++;
if(s==1) return 1;
}
}
void vecini(int x)
{
for(j=1;j<=n;j++)
if(a[x][j]==1) cout<<j<<" ";
}
int main()
{
int x;
f>>n;
citire(n);
if(izolat()==1) cout<<"Graful are varfuri izolate";
else cout<<"Graful nu are varfuri izolate";
cout<<"\n";
if(terminal()==1) cout<<"Graful are varfuri terminale";
else cout<<"Graful nu are varfuri terminale";
cout<<"\n";
cin>>x;
vecini(x);
return 0;
}

37.Sa se afiseze matricea de adiacenta si costul mediu pe muchii.


#include<iostream>
using namespace std;
typedef struct
{
int st,dr,cost;
} TMUCHIE;
TMUCHIE v[30];
int i,j,n,m,a[50][50];
void citire(int m)
{
for(i=1;i<=m;i++)
{
cin>>v[i].st>>v[i].dr>>v[i].cost;

a[v[i].st][v[i].dr]=a[v[i].dr][v[i].st]=1;
}
}
void afisare(int a[50][50],int n)
{
int min,s=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
min=32000;
for(i=1;i<=m;i++) s=s+v[i].cost;
cout<< (float)s/m;
}
int main()
{
cin>>n>>m;
citire(m);
afisare(a,n);
return 0;
}
38.Sa se genereze toate lanturile elementare de dimensiune 3.
#include<iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int a[50][50],n,p,i,j,st[50];
void citire(int n)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>a[i][j];
}
int valid(int p)
{
for(i=1;i<p;i++)
{
if(a[st[i]][st[i+1]]==0) return 0;
if(st[i]==st[p]) return 0;
}
return 1;
}

int final(int p)
{
if(p==3) return 1;
return 0;
}
void tiparire(int p)
{
for(i=1;i<=p;i++)
cout<<st[i]<<" ";
cout<<endl;
}
void back()
{
p=1;
st[p]=0;
while(p>0)
{
if(st[p]<n)
{
st[p]++;
if(valid(p)) if(final(p)) tiparire(p);
else {p++; st[p]=0;}
}
else p--;
}
}
int main()
{
f>>n;
citire(n);
back();
return 0;
}
39.

parcurgerea n latime

#include<iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int a[50][50],viz[50],c[50],i,n;
void citire(int m)
{
int x,y,m;
f>>m;
for(i=1;i<=m;i++)
{

f>>x>>y;
a[x][y]=a[y][x]=1;
}
}
void BF(int start)
{
int inc,sf,x,i;
inc=sf=1;
c[inc]=start;
viz[start]=1;
while(inc<=sf)
{
x=c[inc];
for(i=1;i<=n;i++)
if(a[x][i]==1 && viz[i]==0)
{
sf++;
c[sf]=i;
viz[i]=1;
}
inc++;
}
for(i=1;i<=sf;i++) cout<<c[i]<<" ";
}
int main()
{
f>>n;
citire(m);
BF(1);
return 0;
}
40.Sa se afiseze cea mai mare componenta conexa a unui graf.
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("date.in");
typedef struct
{
int st,dr;
} TMUCHIE ;
TMUCHIE v[100];
int a[100][100],c[100],viz[100],m,n,maxx=-32000,k=1;
void citire()
{
int i;

f>>n>>m;
for(i=1;i<=m;i++)
{
f>>v[i].st>>v[i].dr;
a[v[i].st][v[i].dr]=a[v[i].dr][v[i].st]=1;
}
}
void BF(int start,int p)
{
int x,i,inc,sf,nr=0;
inc=sf=1;
c[inc]=start;
viz[start]=p;
while(inc<=sf)
{
x=c[inc]; inc++;
for(i=1;i<=n;i++)
if(a[x][i]==1&&viz[i]==0){viz[i]=p; sf++; c[sf]=i; nr++;}
}
if(nr>maxx){maxx=nr; k=p;}
}
int main()
{
citire();
int p=0,i;
for(i=1;i<=n;i++)
{
if(viz[i]==0){p++;BF(i,p);}
}
for(i=1;i<=n;i++)
if(viz[i]==k)cout<<i<<" ";
return 0;
}
41. Sa se determine numarul de elemente conexe ale grafului / Sa se determine
numarul de muchii necesare pentru ca graful sa devina conex.
#include<iostream>
#include<fstream>
using namespace std;
int i,a[100][100],c[100],viz[100],n,j,m,nr;
ifstream f("date.in");
void citire(int m)
{
int x,y;
f>>m;
for(i=1;i<=m;i++)

{
f>>x>>y;
a[x][y]=a[y][x]=1;
}
}
void BF(int start)
{
int inc,sf,x;
viz[start]=1;
sf=1; inc=1;
c[inc]=start;
while(inc<=sf)
{
x=c[inc];
for(i=1;i<=n;i++)
if(a[x][i]==1 && viz[i]==0)
{
sf++;
c[sf]=i;
viz[i]=1;
}
inc++;
}
for(i=1;i<=sf;i++)
cout<<"";
nr++;
}
int main()
{
f>>n;
citire(m);
for(i=1;i<=n;i++)
if(viz[i]==0) BF(i);
cout<<nr; // ptr problema 2. cout<<nr-1;
return 0;
}
42.

parcurgerea n adncime

#include<iostream>
using namespace std;
int varf,viz[50],a[50][50],m,n,i,j;
void citire()
{
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)

cin>>a[i][j];
}
void DF(int varf)
{
int k;
cout<<varf<<" ";
viz[varf]=1;
for(k=1;k<=n;k++)
if(a[varf][k]==1 && viz[k]==0) DF(k);
}
int main()
{
citire();
cin>>varf;
DF(varf);
return 0;
}

43.sa se determine componentele conexe si numarul lor folosind parcurgerea DF


#include<iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int a[50][50],n,viz[50];
void citire()
{
int i,j;
f>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>a[i][j];
}
void DF(int vf)
{
int k;
cout<<vf<<" ";
viz[vf]=1;
for(k=1;k<=n;k++)
if(a[vf][k]==1 && viz[k]==0) DF(k);
}
int main()
{
int nr=0,i;
citire();
for(i=1;i<=n;i++)

if(viz[i]==0) { nr++; DF(i); cout<<endl; }


cout<<nr;
f.close();
return 0;
}

44.
sa se determine componenta conexa maxima
#include<iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int a[50][50],n,viz[50],maxi,i,j;
typedef struct
{
int l,v[50];
} con;
con u[50];
void citire()
{
int i,j;
f>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>a[i][j];
}
void DF(int vf)
{
int k;
u[i].v[j]=vf;
u[i].l=j;
if(j>maxi) maxi=j;
viz[vf]=1;
j++;
for(k=1;k<=n;k++)
if(a[vf][k]==1 && viz[k]==0) DF(k);
}
int main()
{
int nr=1,k;
citire();
for(i=1;i<=n;i++)
if(viz[i]==0) { j=1; DF(i); nr++; }
cout<<maxi<<endl;
for(i=1;i<=nr;i++)

if(u[i].l==maxi)
{
for(k=1;k<=u[i].l;k++)
cout<<u[i].v[k]<<" ";
cout<<endl;
}
f.close();
return 0;
}

45.Fiind data matricea de adiacenta a unui graf orientat cu n vrfuri si m arce. Sa


se determine:
a. Gradele exterioare ale tuturor vrfurilor.
b. Gradele interioare ale tuturor vrfurilor.
c. Numarul vrfurilor izolate.
d. Sa se verifice daca graful are bucle.
#include<iostream>
using namespace std;
int a[50][50],n,i,j;
void citire()
{
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
}
int gr_ext(int i)
{
int j,s;
s=0;
for(j=1;j<=n;j++)
s=s+a[i][j];
return s;
}
int gr_int(int j)
{
int i,s;
s=0;
for(i=1;i<=n;i++)
s=s+a[i][j];
return s;
}
int vf_izolat()
{
int nr=0;

for(i=1;i<=n;i++)
if(gr_ext(i)==0 && gr_int(i)==0) nr++;
return nr;
}
int bucla()
{
int s=0;
for(i=1;i<=n;i++) s=s+a[i][i];
if(s!=0) return 1;
else return 0;
}
int main()
{
citire();
for(i=1;i<=n;i++) cout<<gr_ext(i)<<" ";
cout<<endl;
for(j=1;j<=n;j++) cout<<gr_int(j)<<" ";
cout<<endl<<vf_izolat()<<" varfuri izolate."<<endl;
if(bucla()==1) cout<<"Da";
else cout<<"Nu";
return 0;
}
46.Fiind data matricea vrfuri-arce a unui graf orientat cu n vrfuri si m arce. Sa
se determine:
a. Gradele exterioare ale tuturor vrfurilor.
b. Gradele interioare ale tuturor vrfurilor.
c. Numarul vrfurilor izolate.
#include<iostream>
using namespace std;
int a[50][50],n,i,j,m;
void citire()
{
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>a[i][j];
}
int gr_ext(int i)
{
int s;
s=0;
for(j=1;j<=n;j++)
if(a[i][j]==1) s++;
return s;
}

int gr_int(int j)
{
int s;
s=0;
for(j=1;j<=n;j++)
if(a[i][j]==-1) s++;
return s;
}
int vf_izolat()
{
int nr=0;
for(i=1;i<=n;i++)
if(gr_ext(i)==0 && gr_int(i)==0) nr++;
return nr;
}
int main()
{
citire();
for(i=1;i<=n;i++) cout<<gr_ext(i)<<" ";
cout<<endl;
for(i=1;i<=n;i++) cout<<gr_int(j)<<" ";
cout<<endl<<vf_izolat()<<" varfuri izolate."<<endl;
return 0;
}

47.Sa se construiasca matricea drumurilor cnd se cunoaste matricea de


adiacenta.
#include<iostream>
using namespace std;
int a[50][50],b[50][50],n,i,j,k;
void citire()
{
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
}
int main()
{
citire();
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]==0) a[i][j]=a[i][k]*a[k][j];
for(i=1;i<=n;i++)

{
for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}

48.algoritmul roy-floyd
#include<iostream>
using namespace std;
int n,m;
long a[50][50];
const long INF=99999;
void citire()
{
int i,j,x,y,c;
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j) a[i][j]=0;
else a[i][j]=INF;
for(i=1;i<=m;i++)
{
cin>>x>>y>>c;
a[x][y]=c;
}
}
void generare()
{
int k,i,j;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]>a[i][k]+a[k][j]) a[i][j]=a[i][k]+a[k][j];
}
int main()
{
int i,j;
citire();
generare();
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
if(a[i][j]==INF) cout<<"* ";

else cout<<a[i][j]<<" ";


cout<<endl;
}
return 0;
}
49.Verificare daca un graf este complet
#include <iostream>
using namespace std;
int a[100][100],n,i,j;
void citire(){
for(i=1;i<=n;i++) for(j=1;j<=n;j++) cin>>a[i][j];}
int verificare(){
int sem=1;
for(i=1;i<=n;i++) for(j=1;j<=n;j++)
if(i<j) if(a[i][j]!=1) sem=0;
if(sem==1) return 1;
else return 0;}
int main(){
cin>>n;
citire();
if(verificare()==1) cout<<" DA";
else cout<<"NU";
return 0;}

50.Verificare daca un graf este Hamiltonian


#include <iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int a[100][100],x=0,i,j,n,k;
void citire(){
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) f>>a[i][j];}
int hamil(int g[][100]){
for(i=1;i<=n;i++) if(i!=n){if(g[i][i+1]==0) return 0;}
else if(g[i][1]==0) return 0;
return 1;}
int main(){
f>>n;
citire();

if(hamil(a)==1) cout<<"da";
else cout<<"NU";
return 0;}

51.
Afisarea predecesorilor si muchiilor incidente
#include <iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int a[100][100],n,i,j,m,vf;
typedef struct{
int st,dr;}vector;
vector v[100];
void citire(){
for(i=1;i<=m;i++){ f>>v[i].st>>v[i].dr;
a[v[i].st][v[i].dr]=a[v[i].dr][v[i].st]=1;
}}
void pred(int vf){
for(i=1;i<=n;i++) if(a[i][vf]==1) cout<<i<<" ";
}
void muchii(int vf){
for(i=1;i<=n;i++) if(a[i][vf]==1) cout<<"("<<i<<" , "<<vf<<")"<<" ";
}
int main(){
f>>n>>m;
citire();
f>>vf;
pred(vf);
muchii(vf);
return 0;}

52.Numarul componentelor conexe


#include <iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int a[100][100],n,m,i,j,c[100],viz[100],nr=0;
void citire(){
int x,y;
for(i=1;i<=n;i++){
f>>x>>y;
a[x][y]=a[y][x]=1;}}

void BF(int start){


int inc,sf,x;
viz[start]=1;
inc=sf=1;
c[inc]=start;
while(inc<=sf){x=c[inc];
for(i=1;i<=n;i++) if(a[x][i]==1 && viz[i]==0){
sf++;
c[sf]=i;
viz[i]=1;}
inc++;}
for(i=1;i<=sf;i++) c[i]=0;
nr++;}
int main(){
f>>n>>m;
citire();
for(i=1;i<=n;i++) if(viz[i]==0) BF(i);
cout<<nr;
return 0;}
53.Muchiile necesare pentru a deveni graf conex
#include <iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int a[100][100],n,m,i,j,c[100],viz[100],nr=0,v[100],k=0;
void citire(){
int x,y;
for(i=1;i<=n;i++){
f>>x>>y;
a[x][y]=a[y][x]=1;}}
void BF(int start){
int inc,sf,x;
viz[start]=1;
inc=sf=1;
c[inc]=start;
while(inc<=sf){x=c[inc];
for(i=1;i<=n;i++) if(a[x][i]==1 && viz[i]==0){
sf++;
c[sf]=i;
viz[i]=1;}
inc++;}

for(i=1;i<=sf;i++) c[i]=0;
}
int main(){
f>>n>>m;
citire();
for(i=1;i<=n;i++) if(viz[i]==0){v[++k]=i;
BF(i);}
for(i=1;i<=k-1;i++) cout<<v[i]<<" "<<v[i+1]<<endl;
return 0;}

54.Verificare daca matricea data este matrice de adiacenta


#include <iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int a[100][100],n,i,j;
void citire(){
for(i=1;i<=n;i++) for(j=1;j<=n;j++) f>>a[i][j];}
int verificare(){
int sem=1;
for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i<j) if(a[i][j]==a[j][i]) return 1;
return 0;}
int muchii(){
int nr=0;
for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i<j) if(a[i][j]==1) nr++;
return nr*2;
}
int main(){
f>>n;
citire();
if(verificare()==1) cout<<"DA si are"<<muchii()<<"muchii";
else cout<<"NU";
return 0;}
55.Verificare lant
#include <iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
ifstream f1("datee.in");
int a[100][100],n,i,j,k,x,v[100];
void citire(){

for(i=1;i<=n;i++) for(j=1;j<=n;j++) f>>a[i][j];}


void citire_secv(){
k=0;
while(f1>>x) v[++k]=x;}
int verificare(){
for(i=1;i<k;i++) if(a[v[i]][v[i+1]]==0) return 0;
for(i=1;i<=k-1;i++) for(j=i+1;j<=k;j++) if(v[i]!=v[j]) return 2;
return 1;}
int main(){
f>>n;
citire();
citire_secv();
if(verificare()==0) cout<<"nu e lant";
else if(verificare()==1) cout<<"elementar";
else cout<<"neelementar";
return 0;}
56.Gradele varfurilor
#include <iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int a[100][100],n,i,j,k;
void citire(){
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) f>>a[i][j];}
int grad(int x){
int nr=0;
for(i=1;i<=n;i++) if(a[x][i]==1) nr++;
return nr;}
int main(){
f>>n;
citire();
for(k=1;k<=n;k++) cout<<grad(k)<<endl;
return 0;}

57.Graf Eulerian
#include<iostream>
#include<fstream>
using namespace std;

ifstream f("date.in");
int n,i,j,a[100][100],k,st[100],m=0,sem=0;
void citire()
{
f>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
f>>a[i][j];
if(a[i][j]==1)m++;}
}
int valid(int p)
{
for(i=1;i<p;i++)if(a[st[i]][st[i+1]]==0)return 0;
for(i=1;i<=p-2;i++)
for(j=i+1;j<=p-1;j++)
if(st[i]==st[j]&&st[i+1]==st[j+1]||st[i+1]==st[j]&&st[i]==st[j+1])return
0;
return 1;
}
int final(int p)
{
if(p!=m/2+1)return 0;
if(st[1]!=st[p])return 0;
return 1;
}
void back()
{
int p=1;
st[p]=0;
while(p>0)
if(st[p]<n)
{
st[p]=st[p]+1;
if(valid(p))
if(final(p))
sem=1;
else{p++;st[p]=0;}
}
else p--;
}
int main()
{
citire();
back();
if(sem==1)cout<<"DA e eulerian";
else cout<<"NU e eulerian";

return 0;
}

58.Ciclu verificare
#include<iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int a[100][100],n,v[100],p,i,j;
void citire()
{
f>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)f>>a[i][j];
f>>p;p++;
for(i=1;i<=p;i++)f>>v[i];
}
int ver()
{
if(v[1]!=v[p])return 0;
for(i=1;i<p;i++)if(a[v[i]][v[i+1]]==0)return 0;
for(i=1;i<=p-2;i++)
for(j=i+1;j<=p-1;j++)
if(v[i]==v[j]&&v[i+1]==v[j+1]||v[i]==v[j+1]&&v[i+1]==v[j])return 0;
for(i=1;i<=p-2;i++)
for(j=i+1;j<=p-1;j++)if(v[i]==v[j])return 2;
return 1;
}
int main()
{
int x;
citire();
x=ver();
if(x==0)cout<<"Nu";
else if(x==1)cout<<"Da(elementar)";
else cout<<"Da(Neelementar)";
return 0;
}
59.Componenta conexa la distanta cea mai vare de vf1
void BF(int start){
int inc,sf,x,nr=0;
viz[start]=1;
inc=sf=1;
c[inc]=start;

while(inc<=sf){x=c[inc];
for(i=1;i<=n;i++) if(a[x][i]==1 && viz[i]==0){
sf++;
c[sf]=i;
viz[i]=1;
aux[i]=nr;}
inc++;}

}
int main(){
f>>n>>m;
citire();
BF(1);
aux[1]=0;
maxi=aux[1];
for(i=2;i<=n;i++) if(maxi<aux[i]) maxi=aux[i];
for(i=1;i<=n;i++) if(maxi==aux[i]) cout<<i<<" ";
return 0;}
60.Doua grafuri g1,g2.Sa se verifice daca g1 este graf partial al grafului g2
#include <iostream>
using namespace std;
int g1[100][100],g2[100][100],n,i,j;
void citire(int a[100][100]){
for(i=1;i<=n;i++) for(j=1;j<=n;j++) cin>>a[i][j];}
int verif(int g1[100][100],int g2[100][100])
{
for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i<j) if(g2[i][j]==1 && g1[i][j]==0)
return 0;
return 1;
}
int main(){
cin>>n;
citire(g1);
citire(g2);
if(verif(g1,g2)==1) cout<<"partial";
else cout<<"nu";
return 0;}

61.Circuit
#include<iostream>
#include<fstream>

using namespace std;


ifstream f("date.in");
int a[100][100],n,v[100],p,i,j;
void citire()
{
f>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)f>>a[i][j];
f>>p;p++;
for(i=1;i<=p;i++)f>>v[i];
}
int ver()
{
if(v[1]!=v[p])return 0;
for(i=1;i<p;i++)if(a[v[i]][v[i+1]]==0)return 0;
for(i=1;i<=p-2;i++)
for(j=i+1;j<=p-1;j++)
if(v[i]==v[j]&&v[i+1]==v[j+1]||v[i]==v[j+1]&&v[i+1]==v[j])return 0;
for(i=1;i<=p-2;i++)
for(j=i+1;j<=p-1;j++)if(v[i]==v[j])return 2;
return 1;
}
int main()
{
int x;
citire();
x=ver();
if(x==0)cout<<"Nu";
else if(x==1)cout<<"Da(elementar)";
else cout<<"Da(Neelementar)";
return 0;
}
62.Drum
#include <iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
ifstream f1("datee.in");
int a[100][100],n,i,j,k,x,v[100];
void citire(){
for(i=1;i<=n;i++) for(j=1;j<=n;j++) f>>a[i][j];}
void citire_secv(){
k=0;
while(f1>>x) v[++k]=x;}

int verificare(){
for(i=1;i<k;i++) if(a[v[i]][v[i+1]]==0) return 0;
for(i=1;i<=k-1;i++) for(j=i+1;j<=k;j++) if(v[i]!=v[j]) return 2;
return 1;}
int main(){
f>>n;
citire();
citire_secv();
if(verificare()==0) cout<<"nu e drum";
else if(verificare()==1) cout<<"elementar";
else cout<<"neelementar";
return 0;}
63.Transformarea matricii vf arce in matricea de adiacenta
#include<iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int i,j,n,m,a[100][100],b[100][100],x,y;
void citire(int n , int m)
{
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)f>>a[i][j];
}
void matricedeadiacenta()
{
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(a[j][i]==1)x=j;
if(a[j][i]==-1)y=j;
}
b[x][y]=1;
}
}
int main ()
{
f>>n>>m;
citire(n,m);
matricedeadiacenta();
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)cout<<b[i][j]<< " ";
cout<<endl;

}
return 0 ;
}
64.Numarul varfurilor izolate
#include<iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int a[100][100],m,n,i,j;
void citire(){
f>>n;
for(i=1;i<=n;i++) for(j=1;j<=n;j++) f>>a[i][j];}
void vf_iz(){
int sem,k,nr=0;
for(i=1;i<=n;i++){ sem=0;
for(j=1;j<=n;j++) if(a[i][j]==1) sem=1;
if(sem==0) for(k=1;k<=n;k++) if(a[k][i]==1) sem=1;
if(sem==0) nr++;}
cout<<nr;}
int main(){
citire();
vf_iz();
return 0;}
65.Gradele exterioare ale tuturor varfurilor
#include <iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int a[100][100],m,n,i,j;
void citire(){
f>>n;
for(i=1;i<=n;i++) for(j=1;j<=n;j++) f>>a[i][j];}
void vf_ext(){
int s;
for(i=1;i<=n;i++){s=0;
for(j=1;j<=n;j++) s+=a[i][j];
cout<<i<<" "<<s<<endl;}}
int main(){
citire();
vf_ext();
return 0;}

66.Gradele exterioare in matricea vf arce


#include<iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int a[100][100],i,n,j,x,k;
void citire()
{ for(i=1;i<=n;i++)
for(j=1;j<=n;j++)f>>a[i][j];
}
int grad_ext(int x)
{ int nr=0;
for(i=1;i<=n;i++)
if(a[x][i]==1)nr++;
return nr;
}
int grad_int(int x)
{ int nr1=0;
for(j=1;j<=n;j++)
if(a[x][j]==(-1))nr1++;
return nr1;
}
int main ()
{ f>>n;
citire();
cout<<"gradele ext";
cout<<endl;
for(k=1;k<=n;k++){ cout<<grad_ext(k);
cout<<endl;}
cout<<"gradele int";
cout<<endl;
for(k=1;k<=n;k++){ cout<<grad_int(k);
cout<<endl;}
return 0;
}

67.Lant
#include<iostream>
#include<fstream>
using namespace std ;
ifstream f("date.in");
typedef struct
{

int dr, st;


}VARCE;
VARCE v[100];
int m,n,i;
void citire ()
{
for(i=1;i<=m;i++)f>>v[i].st>>v[i].dr;
}
int lant()
{
int a, b, sem=0,a1,b1;
f>>a1>>b1;
for(i=1;i<=m;i++)
if(v[i].st==a1&&v[i].dr==b1){sem=1;break;}
if(sem==0)return 0;
while(f>>a>>b)
{
sem=0;
if(a!=a1&&a!=b1&&b!=a1&&b!=b1)return 0;
for(i=1;i<=m;i++)
if(v[i].st==a&&v[i].dr==b)
{
sem=1;
break;
}
if(sem==0)
return 0;
a1=a;
b1=b;
}
return 1;
}
int main()
{
f>>n>>m;
citire();
if(lant())cout<<"Lant";
else cout<<"No";
f.close();
}

68.Matricea vf arce VF izolate


#include <iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int a[100][100],n,i,j,k;
void citire(){
for(i=1;i<=n;i++) for(j=1;j<=n;j++) f>>a[i][j];}

void vf_iz(){
int gasit,nr=0;
for(i=1;i<=n;i++) {gasit=0;
for(j=1;j<=n;j++) if(a[i][j]==1 ||a[j][i]==(-1)){gasit=1;
break;}
if(gasit==0) nr++;}

cout<<nr;}
int main(){
f>>n;
citire();
vf_iz();
return 0;}
69.Divide et impera : suma nr pare
#include <iostream>
using namespace std;
int n,v[100],i;
int divide(int p ,int q) {
int m,s1,s2;
if(p==q) if(v[p]%2==0) return v[p];
else return 0;
else{ m=(p+q)/2;
s1=divide(p,m);
s2=divide(m+1,q);
return s1+s2;}}
int main(){
cin>>n;
for(i=1;i<=n;i++) cin>>v[i];
cout<<divide(1,n);
return 0;}

70.Divide et impera : suma nr impare


#include <iostream>
using namespace std;
int n,v[100],i;
int divide(int p ,int q) {
int m,s1,s2;
if(p==q) if(v[p]%2==1) return v[p];
else return 0;
else{ m=(p+q)/2;
s1=divide(p,m);
s2=divide(m+1,q);
return s1+s2;}}
int main(){
cin>>n;
for(i=1;i<=n;i++) cin>>v[i];
cout<<divide(1,n);
return 0;}

71.Divide et impera: suma numerelor


#include<iostream>
using namespace std;
int v[100],i,n;
int divide(int p , int q){
int m,s1,s2;
if(p==q) return v[p];
else{ m=(p+q)/2;
s1=divide(p,m);
s2=divide(m+1,q);
return s1+s2;}
}
int main(){
cin>>n;
for(i=1;i<=n;i++) cin>>v[i];
cout<<divide(1,n);
return 0;}
72.Divide et impera: suma elementelor aflate pe pozitii impare
#include<iostream>
using namespace std;
int v[100],i,n;
int divide(int p , int q){

int m,s1,s2;
if(p==q) if(p%2==1) return v[q];
else return 0;
else{ m=(p+q)/2;
s1=divide(p,m);
s2=divide(m+1,q);
return s1+s2;}
}
int main(){
cin>>n;
for(i=1;i<=n;i++) cin>>v[i];
cout<<divide(1,n);
return 0;}
73.Divide et impera: produs
#include<iostream>
using namespace std;
int v[100],i,n;
int divide(int p , int q){
int m,s1,s2;
if(p==q) return v[p];
else{ m=(p+q)/2;
s1=divide(p,m);
s2=divide(m+1,q);
return s1*s2;}
}
int main(){
cin>>n;
for(i=1;i<=n;i++) cin>>v[i];
cout<<divide(1,n);
return 0;}

74.Divide et impera: determinarea minimului


#include<iostream>
using namespace std;
int v[100],i,n;
int divide(int p , int q){
int m,s1,s2;
if(p==q) return v[p];

else{ m=(p+q)/2;
s1=divide(p,m);
s2=divide(m+1,q);
if(s1<s2) return s1;
else return s2;}}

int main(){
cin>>n;
for(i=1;i<=n;i++) cin>>v[i];
cout<<divide(1,n);
return 0;}

75.Divide et impera:determinarea maximului


#include<iostream>
using namespace std;
int v[100],i,n;
int divide(int p , int q){
int m,s1,s2;
if(p==q) return v[p];
else{ m=(p+q)/2;
s1=divide(p,m);
s2=divide(m+1,q);
if(s1>s2) return s1;
else return s2;}}

int main(){
cin>>n;
for(i=1;i<=n;i++) cin>>v[i];
cout<<divide(1,n);
return 0;}

76.Divide et impera:numerele divizibile cu 3 dar nu cu 5


#include<iostream>
using namespace std;
int v[100],i,n;
int divide(int p , int q){
int m,s1,s2;
if(p==q) if(v[p]%3==0 && v[p]%5!=0) return v[q];

else return 0;
else{ m=(p+q)/2;
s1=divide(p,m);
s2=divide(m+1,q);
return s1+s2;}
}
int main(){
cin>>n;
for(i=1;i<=n;i++) cin>>v[i];
cout<<divide(1,n);
return 0;}

77.Se citeste un arbore cu n noduri dat prin vectorul tata.Sa se afiseze muchiile
arborelui si sa se construiasca si sa se afiseze
matricea de adiacenta a arborelui
#include<iostream.h>
#include<fstream.h>
ifstream f("date.in");
int T[100],i,n,a[100][100],j;
void citire()
{ for(i=1;i<=n;i++) f>>T[i];}
void matrice()
{ for(i=2;i<=n;i++) cout<<i<<" "<<T[i]<<endl;
for(i=1;i<=n;i++) {a[i][T[i]]=1;
a[T[i]][i]=1;}
for(i=1;i<=n;i++) { for(j=1;j<=n;j++) cout<<a[i][j]<<" ";
cout<<endl;}
}
int main()
{ f>>n;
citire();
matrice();
return 0;}

78.Reprezentarea dinamica a arborilor binari


#include<iostream.h>
#include<fstream.h>
ifstream f("date.in");
ofstream g("date.out");
typedef struct nod
{int info;

nod *st,*dr;}TNOD;
TNOD *r;
void creare(TNOD *&r)
{ int x;
f>>x;
if(!x) r=NULL;
else { r=new TNOD;
r->info=x;
creare(r->st);
creare(r->dr);}
}
void RSD(TNOD *r)
{ if(r) { g<<r->info<<" ";
RSD(r->st);
RSD(r->dr);}
}
void SRD(TNOD *r)
{ if(r) {SRD(r->st);
g<<r->info<<" ";
SRD(r->dr);}
}
void SDR(TNOD *r)
{ if(r) { SDR(r->st);
SDR(r->dr);
g<<r->info<<" ";}
}
int main()
{ r=NULL;
creare(r);
g<<"RSD:";
RSD(r);
g<<endl;
g<<"SRD:";
SRD(r);
g<<endl;
g<<"SDR:";
SDR(r);
return 0;}

79.Sa se determine numarul valorlor perfecte din arbore

#include<iostream.h>
#include<fstream.h>
ifstream f("date.in");
ofstream g("date.out");

int nr;
typedef struct nod
{int info;
nod *st,*dr;}TNOD;
TNOD *r;
int perfect(int x)
{ int d,s=0;
for(d=1;d<=x/2;d++) if(x%d==0) s=s+d;
if(s==x) return 1;
else return 0;}
void creare(TNOD *&r)
{ int x;
f>>x;
if(!x) r=NULL;
else { r=new TNOD;
r->info=x;
creare(r->st);
creare(r->dr);}
}
void RSD(TNOD *r)
{
if(r) { if(perfect(r->info)==1)nr++;
RSD(r->st);
RSD(r->dr);}
}
int main()
{ r=NULL;
creare(r);
RSD(r);
g<<nr;
return 0;}

80.Sa se afiseze numerele prime din arbore


#include<iostream.h>
#include<fstream.h>
ifstream f("date.in");
ofstream g("date.out");
typedef struct nod
{int info;
nod *st,*dr;}TNOD;
TNOD *r;
int prim(int x)
{ int d;
for(d=2;d<=x/2;d++) if(x%d==0) return 0;

return 1;}
void creare(TNOD *&r)
{ int x;
f>>x;
if(!x) r=NULL;
else { r=new TNOD;
r->info=x;
creare(r->st);
creare(r->dr);}
}
void RSD(TNOD *r)
{ if(r) { if(prim(r->info)==1)g<<r->info<<" ";
RSD(r->st);
RSD(r->dr);}
}
int main()
{ r=NULL;
creare(r);
RSD(r);
return 0;}

81.Sa se verifice daca toate numarele sunt palindroame


#include<iostream.h>
#include<fstream.h>
ifstream f("date.in");
ofstream g("date.out");
int sem=1;
typedef struct nod
{int info;
nod *st,*dr;}TNOD;
TNOD *r;
int palindrom(int x)
{ int c,s=0;
c=x;
while(c!=0) { s=s*10+c%10;
c=c/10;}
if(x==s) return 1;
else return 0;}
void creare(TNOD *&r)
{ int x;
f>>x;
if(!x) r=NULL;
else { r=new TNOD;
r->info=x;
creare(r->st);

creare(r->dr);}
}
void RSD(TNOD *r)
{ if(r) { if(palindrom(r->info)==0)sem=0;
RSD(r->st);
RSD(r->dr);}
}
int main()
{ r=NULL;
creare(r);
RSD(r);
if(sem==1) g<<"da";
else g<<"nu";
return 0;}
82.Se citeste un arbore cu n varfuri repr prin vectorul de tati.Sa se afiseze
frunzele arborelui
#include<iostream.h>
int main()
{ int viz[50],T[50,i,n;
cin>>n;
for(i=1;i<=n;i++) { cin>>T[i];
viz[T[i]]=1;}
for(i=1;i<=n;i++) if(viz[i]!=1) cout<<i<<" ";
return 0; }

83.Se citeste un arbore cu n varfuri repr prin vectorul de tati.Sa se afiseze


nodurile frati din arbore

#include<iostream.h>
int T[100],i,j,n;
void frati()
{for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(T[i]==T[j] && i!=j)cout<<i<<"
"<<j<<endl;
}
int main()
{ int viz[50],T[50,i,n;
cin>>n;
for(i=1;i<=n;i++) cin>>T[i];
frati();
return 0; }

84.Sa se afiseze suma cheilor de pe un anumit nivel citit de la tastatura

#include<iostream.h>
typedef struct nod
{
int info;
nod *st,*dr;
}TNOD;
TNOD *r;
int viz[100],aux=1;
void creare(TNOD *&r)
{
int x;
cin>>x;
if(!x)r=NULL;
else
{
r=new TNOD;
r->info=x;
cout<<"Succesorul stang al lui "<< x<<": ";
creare(r->st);
cout<<"Succesorul drept al lui "<< x<<": ";
creare(r->dr);
}
}
void RSD(TNOD *r)
{
if(r){viz[r->info]=aux;
aux=aux+1;
RSD(r->st);
RSD(r->dr);
aux=aux-1;
}
}
int main()
{
int n,i,s=0;
r=NULL;
creare(r);
RSD(r);
cin>>n;
for(i=1;i<=12;i++)
if(viz[i]==n)s+=i;
cout<<s;
return 0;

85.Sa se afiseze cheile de pe un anumit nivel citit de la tastatura

#include<iostream.h>
typedef struct nod
{
int info;
nod *st,*dr;
}TNOD;
TNOD *r;
int viz[100],aux=1;
void creare(TNOD *&r)
{
int x;
cin>>x;
if(!x)r=NULL;
else
{
r=new TNOD;
r->info=x;
cout<<"Succesorul stang al lui "<< x<<": ";
creare(r->st);
cout<<"Succesorul drept al lui "<< x<<": ";
creare(r->dr);
}
}
void RSD(TNOD *r,int niv,int x)
{
if(r){if(niv==x) cout<<r->info<<" ";
RSD(r->st,niv+1,x);
RSD(r->dr,niv+1,x);
}
}
int main()
{
int n,i,x;
cin>>x;
r=NULL;
creare(r);
RSD(r);
cin>>n;
return 0;
}

86.Sa se afiseze inaltimea arborelui


#include<iostream.h>
typedef struct nod
{
int info;
nod *st,*dr;
}TNOD;
TNOD *r;
int viz[100],aux=1;
void creare(TNOD *&r)
{
int x;
cin>>x;
if(!x)r=NULL;
else
{
r=new TNOD;
r->info=x;
cout<<"Succesorul stang al lui "<< x<<": ";
creare(r->st);
cout<<"Succesorul drept al lui "<< x<<": ";
creare(r->dr);
}
}
int RSD(TNOD *r,int niv)
{ int n1,n2;
if(!r)return niv-1;
else { n1=RSD(r->st,niv+1);
n2=RSD(r->dr,niv+1);
if(n1>n2) return n1;
else return n2;
}
}
int main()
{
int n,i,x;
r=NULL;
creare(r);
cin>>n;
cout<<RSD(r,niv);
return 0;
}

87.Sa se verifice daca exista un nod cu o aloare data in arbore


#include<iostream.h>
#include<fstream.h>
ifstream f("date.in");
ofstream g("date.out");
int sem=1;
typedef struct nod
{int info;
nod *st,*dr;}TNOD;
TNOD *r;
int m;
void creare(TNOD *&r)
{ int x;
f>>x;
if(!x) r=NULL;
else { r=new TNOD;
r->info=x;
creare(r->st);
creare(r->dr);}
}
void RSD(TNOD *r)
{ if(r) { TNOD(r->st);
TNOD(r->dr);
if(m==r->info) cout<<"da";
}
int main()
{ r=NULL;
cin>>m;
creare(r);
RSD(r);
return 0;}

88.Sa se det nr val pseudoperfecte dintr-un arbore parcurgandu-l dinamic.


#include<iostream.h>
typedef struct nod
{
int info;
nod *st,*dr;
}TNOD;
TNOD *r;
void creare(TNOD *&r)
{
int x;
cin>>x;

if(!x)r=NULL;
else
{
r=new TNOD;
r->info=x;
cout<<"Succesorul stang al lui "<< x<<": ";
creare(r->st);
cout<<"Succesorul drept al lui "<< x<<": ";
creare(r->dr);
}
}
int pp(int x)
{
int s=1,i;
for(i=2;i<=x/2;i++)if(x%i==0)s+=i;
if(x%s==0)return 1;
else return 0;
}
void RSD(TNOD *r)
{
if(r){if(pp(r->info))cout<<r->info<<" ";
RSD(r->st);
RSD(r->dr);
}
}
int main()
{
r=NULL;
creare(r);
RSD(r);
return 0;
}

89.Arbori binari de cautare


#include<iostream.h>
typedef struct nod
{ int info;
nod *st,*dr;}TNOD;
TNOD *p;
int x;
void creare(TNOD *&p,int x)
{ if(p==NULL) { p=new TNOD;
p->info=x;
p->st=NULL;
p->dr=NULL;

}
else if(x>p->info) creare(p->dr,x);
else if(x<p->info) creare(p->st,x);
else cout<<"Exista";
}
void SRD(TNOD *p)
{ if(p) { SRD(p->st);
cout<<p->info<<" ";
SRD(p->dr);}
}
int main()
{
cin>>x;
while(x!=0) { creare(p,x);
cin>>x;}
SRD(p);
delete(p);
return 0; }

90.Arbori paritali de cost minim.Algoritmul lui Kruskal


#include<iostream.h>
#include<fstream.h>
ifstream f("date.in");
struct muchie { int st,dr;
float c;
};
int n,m;
muchie v[100];
float cost;
void citire()
{ int i;
f>>n>>m;
for(i=1;i<=m;i++) f>>v[i].st>>v[i].dr>>v[i].c;
}
void sortare()
{ int sem;
muchie copie;
do{sem=1;
for(int i=1;i<=m;i++) if(v[i].c>v[i+1].c){ sem=0;
copie=v[i+1];
v[i+1]=v[i];
v[i]=copie;}
}while(sem==0);
}
void kruskal()

{ int i,x,y,l,R[100],k,nr_m;
for(i=1;i<=m;i++) R[i]=i;
l=1;
cost=0;
nr_m=0;
while(l<=m ||nr_m<n-1) { x=v[l].st;
y=v[l].dr;
if(R[x]!=R[y]) { nr_m++;
cout<<"("<<x<<","<<y<<")"<<endl;
cost=cost+v[l].c;
for(k=1;k<=n;k++) if(R[k]==R[y]) R[k]=R[x];}
l++;}
if(nr_m<n-1) cout<<"Nu se poate construi arborele.";
else cout<<cost;
}
int main()
{ citire();
sortare();
kruskal();
return 0; }

91.Algoritmul lui Prim


#include<iostream.h>
#include<fstream.h>
ifstream f("date.in");
int cost[100][100],v[100],nv[100],n,m;
void citire()
{
int i,x,y;
f>>n>>m;
for(i=1;i<=m;i++) {
f>>x>>y;
f>>cost[x][y];
cost[y][x]=cost[x][y];
}
}
void n_viz() //marcam fapul ca nu a fost vizitat niciodata
{
for(int i=1;i<=n;i++) nv[i]=1;
}
int gata() // verificam daca se implineste conditia de arbore

{
int s=0;
for(int i=1;i<=n;i++) s=s+v[i];
return s;
}
void Prim()
{
int x,i,j,a,b,min,gasit;
cout<<"De la ce nod doresti sa incepi editarea: ";
cin>>x;
v[x]=1;
nv[x]=0;
do
{
min=3200;
gasit=0;
for(i=1;i<=n;i++) if(v[i]==1) for(j=1;j<=n;j++) if(nv[j]==1) if(cost[i][j]!=0
&& cost[i][j]<min) {
min=cost[i][j];
a=i;
b=j;
gasit=1;
}
if(gasit) cout<<"("<<a<<" ; "<<b<<")"<<endl;
v[b]=1;
nv[b]=0;
}while(gata()!=n && gasit);
}
int main()
{
citire();
n_viz();
Prim();
return 0;
}

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