Arbori, Greedy
A. Arbori
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
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
}
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
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