#include "Graf.h" #include #include /** * the constructor * * @param n the number of nodes * @param m the number of edges */ Graf::Graf(int n, int m) { nr_noduri = n; nr_muchii = m; noduri = (Nod *)calloc (n, sizeof(Nod)); muchii = (Muchie *)calloc (m, sizeof (Muchie)); } /** * the constructor * * @param filename the input filename */ Graf::Graf(char * filename) { FILE *file = fopen(filename, "r"); int s, d; double cost; if (file == NULL) { perror("Error reading file"); exit(1); } else { fscanf(file, "%i %i", &nr_noduri, &nr_muchii); noduri = (Nod * )calloc(nr_noduri, sizeof(Nod)); muchii = (Muchie * )calloc(nr_muchii, sizeof(Muchie)); for(int i = 0 ; i < nr_noduri ; i ++) { fscanf(file, "%lf", &cost); noduri[i] = Nod(i, cost); } for(int i = 0 ; i < nr_muchii ; i ++) { fscanf(file, "%i %i %lf", &s, &d, &cost); int gasit = 0, sursa = -1, destin = -1; for(int j = 0 ; j < nr_noduri ; j ++) { if(gasit == 2) break; if(noduri[j].id == s) { sursa = j; gasit ++;} if(noduri[j].id == d) { destin = j; gasit ++;} } muchii[i] = Muchie(&noduri[sursa], &noduri[destin], cost); noduri[destin].addPredecesor(&muchii[i]); noduri[sursa].addSuccesor(&muchii[i]); } } fclose (file); } /** * method printing the graph's information */ void Graf::print() { printf("### graf\n"); printf("nr_noduri = %i, nr_muchii = %i\n", nr_noduri, nr_muchii); for(int i = 0 ; i < nr_noduri ; i ++) noduri[i].print(); for(int i = 0 ; i < nr_muchii ; i ++) muchii[i].print(); printf("###\n"); } /** * copy operator */ Graf& Graf::operator=(const Graf& clone) { //printf("!!!\n"); nr_noduri = clone.nr_noduri; nr_muchii = clone.nr_muchii; noduri = (Nod *)calloc(nr_noduri, sizeof(Nod)); muchii = (Muchie *)calloc(nr_muchii, sizeof(Muchie)); for(int i = 0 ; i < nr_noduri ; i ++) noduri[i] = Task(clone.noduri[i].id, clone.noduri[i].cost); for(int i = 0 ; i < nr_muchii ; i ++) { int gasit = 0, sursa = -1, destin = -1; for(int j = 0 ; j < nr_noduri ; j ++) { if(gasit == 2) break; if(noduri[j].id == clone.muchii[i].predecesor->id) { sursa = j; gasit ++;} if(noduri[j].id == clone.muchii[i].succesor->id) { destin = j; gasit ++;} } muchii[i] = Muchie(&noduri[sursa], &noduri[destin], clone.muchii[i].cost); noduri[destin].addPredecesor(&muchii[i]); noduri[sursa].addSuccesor(&muchii[i]); } return *this; }