[122] | 1 | #include "Graf.h" |
---|
| 2 | #include <stdio.h> |
---|
| 3 | #include <stdlib.h> |
---|
| 4 | |
---|
| 5 | /** |
---|
| 6 | * the constructor |
---|
| 7 | * |
---|
| 8 | * @param n the number of nodes |
---|
| 9 | * @param m the number of edges |
---|
| 10 | */ |
---|
| 11 | Graf::Graf(int n, int m) |
---|
| 12 | { |
---|
| 13 | nr_noduri = n; |
---|
| 14 | nr_muchii = m; |
---|
| 15 | noduri = (Nod *)calloc (n, sizeof(Nod)); |
---|
| 16 | muchii = (Muchie *)calloc (m, sizeof (Muchie)); |
---|
| 17 | } |
---|
| 18 | |
---|
| 19 | /** |
---|
| 20 | * the constructor |
---|
| 21 | * |
---|
| 22 | * @param filename the input filename |
---|
| 23 | */ |
---|
| 24 | Graf::Graf(char * filename) |
---|
| 25 | { |
---|
| 26 | FILE *file = fopen(filename, "r"); |
---|
| 27 | int s, d; |
---|
| 28 | double cost; |
---|
| 29 | |
---|
| 30 | if (file == NULL) |
---|
| 31 | { |
---|
| 32 | perror("Error reading file"); |
---|
| 33 | exit(1); |
---|
| 34 | } |
---|
| 35 | else |
---|
| 36 | { |
---|
| 37 | fscanf(file, "%i %i", &nr_noduri, &nr_muchii); |
---|
| 38 | noduri = (Nod * )calloc(nr_noduri, sizeof(Nod)); |
---|
| 39 | muchii = (Muchie * )calloc(nr_muchii, sizeof(Muchie)); |
---|
| 40 | for(int i = 0 ; i < nr_noduri ; i ++) |
---|
| 41 | { |
---|
| 42 | fscanf(file, "%lf", &cost); |
---|
| 43 | noduri[i] = Nod(i, cost); |
---|
| 44 | } |
---|
| 45 | for(int i = 0 ; i < nr_muchii ; i ++) |
---|
| 46 | { |
---|
| 47 | fscanf(file, "%i %i %lf", &s, &d, &cost); |
---|
| 48 | int gasit = 0, sursa = -1, destin = -1; |
---|
| 49 | for(int j = 0 ; j < nr_noduri ; j ++) |
---|
| 50 | { |
---|
| 51 | if(gasit == 2) break; |
---|
| 52 | if(noduri[j].id == s) { sursa = j; gasit ++;} |
---|
| 53 | if(noduri[j].id == d) { destin = j; gasit ++;} |
---|
| 54 | } |
---|
| 55 | muchii[i] = Muchie(&noduri[sursa], &noduri[destin], cost); |
---|
| 56 | noduri[destin].addPredecesor(&muchii[i]); |
---|
| 57 | noduri[sursa].addSuccesor(&muchii[i]); |
---|
| 58 | } |
---|
| 59 | } |
---|
| 60 | fclose (file); |
---|
| 61 | } |
---|
| 62 | |
---|
| 63 | /** |
---|
| 64 | * method printing the graph's information |
---|
| 65 | */ |
---|
| 66 | void Graf::print() |
---|
| 67 | { |
---|
| 68 | printf("### graf\n"); |
---|
| 69 | printf("nr_noduri = %i, nr_muchii = %i\n", nr_noduri, nr_muchii); |
---|
| 70 | for(int i = 0 ; i < nr_noduri ; i ++) |
---|
| 71 | noduri[i].print(); |
---|
| 72 | for(int i = 0 ; i < nr_muchii ; i ++) |
---|
| 73 | muchii[i].print(); |
---|
| 74 | printf("###\n"); |
---|
| 75 | } |
---|
| 76 | |
---|
| 77 | /** |
---|
| 78 | * copy operator |
---|
| 79 | */ |
---|
| 80 | Graf& Graf::operator=(const Graf& clone) |
---|
| 81 | { |
---|
| 82 | //printf("!!!\n"); |
---|
| 83 | nr_noduri = clone.nr_noduri; |
---|
| 84 | nr_muchii = clone.nr_muchii; |
---|
| 85 | noduri = (Nod *)calloc(nr_noduri, sizeof(Nod)); |
---|
| 86 | muchii = (Muchie *)calloc(nr_muchii, sizeof(Muchie)); |
---|
| 87 | for(int i = 0 ; i < nr_noduri ; i ++) |
---|
| 88 | noduri[i] = Task(clone.noduri[i].id, clone.noduri[i].cost); |
---|
| 89 | for(int i = 0 ; i < nr_muchii ; i ++) |
---|
| 90 | { |
---|
| 91 | int gasit = 0, sursa = -1, destin = -1; |
---|
| 92 | for(int j = 0 ; j < nr_noduri ; j ++) |
---|
| 93 | { |
---|
| 94 | if(gasit == 2) break; |
---|
| 95 | if(noduri[j].id == clone.muchii[i].predecesor->id) { sursa = j; gasit ++;} |
---|
| 96 | if(noduri[j].id == clone.muchii[i].succesor->id) { destin = j; gasit ++;} |
---|
| 97 | } |
---|
| 98 | muchii[i] = Muchie(&noduri[sursa], &noduri[destin], clone.muchii[i].cost); |
---|
| 99 | noduri[destin].addPredecesor(&muchii[i]); |
---|
| 100 | noduri[sursa].addSuccesor(&muchii[i]); |
---|
| 101 | } |
---|
| 102 | return *this; |
---|
| 103 | } |
---|