Sunteți pe pagina 1din 4

ATP - Sem 13

Arbori, Greedy

A. Arbori

1. Arbori de cost minim – Alg. Kruskal - exemplu

B. Greedy

2. Plata unei sume s (utilizand si bancnota unitate) – scrieti programul C care permite plata unei sume
S ce apartine lui N, utilizand cat mai putine bancnote din tipurile ai, i=1...n, stiind ca printre acestea
se afla si bancnota cu valoare unitate. Sunt disponibile cantitati nelimitate din fiecare tip de
bancnota.

o exemplu numeric

Dati suma dorita: 19


Dati numarul de tipuri de bancnote: 4
tb[0]=5
tb[1]=4
tb[2]=3
tb[3]=1

Nr. monezi de tipul [0] = 3


Nr. monezi de tipul [1] = 1
Nr. monezi de tipul [2] = 0
Nr. monezi de tipul [3] = 0

Exemplu de rulare

o algoritm

Indicatii
-Biblioteci
-Functia pentru plata sumei:
obs: ultimul tip de moneda este 1, sr – suma ramasa, IN: suma (s) , tipuri bancnote (t), numar tipuri (n);
OUT: nr din fiecare tip (sol)
void plata_unitate (int s, int *t, int n, int* sol)
{
declarari
initializare suma ramasa cu s;
calcul solutie de plata
}

-in functia main


{
- declarari variabile intregi: suma, tb[10], n, sol[10], i; //tb - tipuri bancnote, n - nr tipuri
- se citesc de la tastatura: suma dorita, numarul de tipuri de monezi, vectorul cu valorile monezilor in
ordine descrescatoare (daca nu, trebuie sortat descrescator)
- apel functie plata_unitate (...)
- afisare rezultat
}

3. Problema paznicului – se da o livada in care pomii sunt plasati pe m linii, cate n pe fiecare linie.
Distantele intre pomii adiacenti sunt egale atat pe linie, cat si intre linii. In una din cele mxn pozitii se
afla un paznic (ca exceptie, acolo nu se afla pom), care poate vedea pomii pe orice directie, dar daca mai
multi pomi se afla pe exact aceeasi directie il vede doar pe cel mai apropiat. Sa se scrie subprogramul
care determina numarul de pomi pe care poate sa ii vada paznicul din pozitia (x,y);

Exemplu:

Raspuns:

Obs:
- pentru pomii vizibili, cele doua distante sunt numere prime intre ele,
- pentru pomii care nu sunt vizibili, cele doua distante au un divizor comun >=2
- pomii pentru care una din distante este zero, ( pe acceasi linie sau coloana cu paznicul) sunt vizibili
doar daca cealalta distanta este 1.

Indicatii
-Bibliotecite: stdio.h, conio.h, stdlib.h
-functie cmmdc (int a, int b)
{ ....}

-functie pomi: IN: dimensiuni livada (m,n), pozitie paznic (x,y), OUT: numar de pomi vizibili
int pomi (int m, int n, int x, int y)
{
- declarari; int i,j,nr;
- initializare nr de pomi vazuti cu 0;
- algoritm pentru identificarea pomilor vazuti (in for-uri se va pleca de la 1)
}

- in main:
{ - declarari;
- se citesc dimensiunile livezii;
- se citeste pozitia paznicului
- apel functie pomi (...)
- afisare rezultat (numar de pomi vazuti de paznic din pozitia indicata)
}

Tema

Grafuri
1. Scrieti un subprogram care verifica daca un graf neponderat reprezentat tabelar este complet (intre oricare doua varfuri
exista muchie).
2. Scrieti un subprogram care, folosind reprezentarea tabelara a unui graf ponderat, determina varfurile izolate si varfurile
care au proprietatea ca sunt extremitate a cel putin k muchii, unde k este o valoare data.
3. Scrieti un subprogram care determina nodurile izolate ale unui graf orientat reprezentat prin matricea de adiacenta.
4. Scrieti un subprogram care determina componentele conexe ale unui graf, reprezentat tabelar, folosind metodele de
parcurgere in latime generalizata, adancime generalizata, matricea existentei drumurilor.
5. Determinati gradul unui nod din cadrul unui graf.
6. Scrieti programul C ce contine subprogramul care verifica daca un graf neponderat este arbore.
Rezolvare: o modalitate de a verifica este aceea a a testa conditia daca graful este conex si daca numarul de varfuri este cu
1 mai mare decat numarul de muchii.
7. Algoritmul lui Prim.

Greedy
1.Interclasare optima a n vectori – se da un numar de vectori, fiecare fiind sortat crescator. Sa se scrie subprogramul care
interclaseaza vectorii astfel incat sa se efectueze cat mai putine miscari de elemente.
2. Problema sumei maxime – se da o multime de elemente reale A={a1, a2, ..., an}. Se cere sa se scrie functia care
determina o submultime Sinclusa in A, astfel incat suma elementelor submultimii S sa fie cea mai mare posibila.
3. Se da o permutare P=(p1, p2, ...,pn). Se cere sa se descompuna aceasta permutare intr-un produs de transpozitii*: a)
oarecare si b) de forma (1,i).
Obs: o transpozitie este o permutare obtinuta din permutarea identica prin interschimbarea elementelor de pe pozitiile i si
j.
6. Problema rucsacului – forma intreaga (obiectele nu pot fi fractionate) si forma continua (obiectele pot fi fractionate si se
va utiliza intreaga capacitate de transport).
4. Fiind dat un numar natural k>1. Sa se scrie programul care determina cel mai mic numar natural avand exact k divizori
naturali proprii (diferiti de 1 si de n).
5. Construire arbore partial de cost minim asociat unui graf (Kruskal si Prim)
Anexa – aspecte teoretice

Arbori
1. Arbore = un graf conex si fara cicluri*
*Daca un digraf este ciclic sau aciclic se poate verifica utilizand algoritmul Marimont (vezi exemplu si implementare in suportul
de curs).
2. Orice arbore H=(X,V) cu n>=2 varfuri contine cel putin doua varfuri terminale.
3. Orice arbore cu n varfuri are n-1 muchii.
4. Un graf G =(X,U) care nu contine cicluri se numeste aciclic.
5. Un graf G este arbore daca si numai daca G este conex si n = m+1, unde n este nr. de vf si m nr. de muchii.
6. Un arbore orientat este un arbore directionat cu radacina.
7. Reprezentari arbori:
 FIU-FRATE – si exemplu
8. Parcurgeri:
 A-preordine
 A-postordine
 pe niveluri - exemplu

Arbore partial de cost minim (APM)


1. Fie un graf G. Un graf partial H al sau care in plus este si arbore se numeste arbore partial 2. Pentru graful G conex, cu functia
de cost c, exista un graf partial H conex si de cost minim, care in plus, este arbore.
 Algoritmul Kruskal
 Algoritmul Prim

Greedy
- metoda Greedy se aplica problemelor de optimizare
- metoda construieste solutia optima pas cu pas, la fiecare pas fiind selectat in solutie elementul care pare “cel mai bun” la
momentul respectiv, in speranta ca aceasta alegere locala va conduce la optimul global.
- algoritmii Greedy sunt foarte eficienti insa nu conduc in mod necesar la o solutie optima.

Descriere algoritm:
o se primeste multimea A cu n elemente
o se initializeaza solutia B ca multime vida
o se repeta de p<=n ori
 alege un element candidat x din multimea A
 verifica daca B reunit cu {x} este solutie acceptabila
 daca da, adauga x la multimea B. B = B reunit cu {x}
o se trimite multimea B ca solutie

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