Sunteți pe pagina 1din 5

Oros Adriana Oana Grupa 224 Algoritmica grafelor Documentatie laborator 3

Formularea problemei
Sa se construiasca un algoritm care determina momentele tarzii(Ti) de incepere a activitatilor. Se da : Numarul activitatilor,durata fiecarei activitate, numarul de activitati precedente, precum si activitatile precedente. Se cere: Momentele tarzii de incepere a activitatii.

Modelarea problemei si demonstrarea corectitudinii problemei

Codul sursa
#include <iostream> #include <fstream> #include <stdlib.h> using namespace std; int t[20], T[20], d[20], n, pred[20][20]; void sterge(int x, int y[], int &m){ int i,j; for (i = 0; i <= m; i++) if (y[i] == x){ for (j = i; j <= m - 1; j++) y[j] = y[j + 1]; m--; return; } } void citire(){ fstream f("src/graf.txt"); int i, j, nrpred, y[20], m; f >> n; m = n; for (i = 0; i <= m; i++)//posibili predecesori ai lui n+1 y[i] = i; d[0] = 0;//durata 0 a activitatii fictive, de debut for (i = 1; i <= n; i++){ f >> d[i]; f >> nrpred; pred[i][0] = nrpred; if (nrpred == 0) { pred[i][1] = 0; sterge(pred[i][1], y, m); //eliminarea lui 0 din posibilii predecesori ai lui n+1 } for (j = 1; j <= nrpred; j++) { f >> pred[i][j]; sterge(pred[i][j], y, m); //eliminarea lui pred[i][j] din posibilii predecesori ai lui n+1 } } //adaugarea in pred[n+1][] pred[n + 1][0] = m+1; for (i = 0; i <= m; i++) pred[n + 1][i + 1] = y[i]; } int minSuc(int a){ int i, m, min = 30000, j;

for (i = 1; i <= n + 1; i++) for (j = 1; j <= pred[i][0]; j++) if (pred[i][j] == a) { m = T[i] - d[a]; if (m < min) min = m; } return min; } int maxPred(int a){ int i,m,max=0; for (i = 1; i <= pred[a][0]; i++){ m = t[pred[a][i]] + d[pred[a][i]]; if (m>max) max = m; } return max; } void calct(){ int i; t[0] = 0; for (i = 1; i <= n+1; i++) t[i] = maxPred(i); } void calcT(){ T[n + 1] = t[n + 1]; int i; for (i = n; i >= 0; i--) T[i] = minSuc(i); } int main(int argc, char* argv[]) { citire(); int i,j; cout << "Graful potentiale-activitati" << endl; for (i = 1; i <= n + 1; i++){ cout << i << " : "; if (pred[i][0] == 0) cout << 0; else for (j = 1; j <= pred[i][0]; j++) cout << pred[i][j] << " "; cout << endl; } calct(); calcT(); cout << "Momentele tarzii de incepere a activitatilor" << endl; for (i = 1; i <= n + 1; i++) cout << i << " : " << T[i] << endl; return 0; }

Date test-Exemplu
Construirea unei cladiri necesita realizarea urmatoarelor activitati: Nr. Cod Denumire activitate 1 A Amenajare cai acces 2 B Sapare santuri fundatie 3 C Constr. structuri de rezistenta 4 D Montaj inst. Sanitare si electrice 5 E Montaje usi-ferestre 6 F Montare schela 7 G Realizare fatada 8 H Zugraveala interioara 9 I Amenajari interioare 10 J Demontare schela 11 K Curatenie 12 L Imprejmuiri Durata 7 3 8 2 3 1 3 2 1 1 2 3 Activ. precedente 1 2 3 3 3 6 4,5 8 7 9,10 1

Graf.txt
12 7 0 3 1 8 1 2 1 3 1 1 1 3 1 2 2 1 1 1 1 2 2 3 1

Date de iesire Graful potentale-activitati Momentele tarzii


1 : 0 2 : 7 3 : 10 4 : 19 5 : 18 6 : 19 7 : 20 8 : 21 9 : 23 10 : 23 11 : 24 12 : 23 13 : 26 1 : 0 2 : 1 3 : 2 4 : 3 5 : 3 6 : 3 7 : 6 8 : 4 5 9 : 8 10 : 7 11 : 9 10 12 : 1 13 : 11 12

1 2 3 3 3 6 4 5 8 7 9 10 1

Alt exemplu:

Graf.txt 5 60 911 311 412 2234

Date de iesire Graful potentale-activitati


1 2 3 4 5 6 : : : : : : 0 1 1 2 3 4 5 1 2 3 4 5 6 : : : : : : 0 6 16 15 19 21

Momentele tarzii