-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
160 lines (143 loc) · 4.29 KB
/
main.cpp
File metadata and controls
160 lines (143 loc) · 4.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/**
* Copyright 2018
*
* Fișierul principal
*/
// Biblioteci
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>
// Fișiere header cu definițiile claselor și codul funcțiilor
#include "Graph.h"
#include "Hashtable.h"
#include "Hash_functions.h"
#include "Structs.h"
#include "Tasks.h"
// Declarări using
using std::cin;
using std::string;
using std::ofstream;
using std::vector;
using std::sort;
using std::max_element;
int main() {
// Variabile cu semnificațiile date în enunț
int N, M, B, K, L, P;
// Iterator, indecși orașe
int i, indexSRC, indexDST;
// Structura unei linii citite pentru taskul 4
struct Car journey;
// Nume de orașe
string name, src, dst;
// Nume orașe pentru taskul 3
string isolated;
// Nume orașe cu benzinării pentru taskul 4
string station;
// Iterator prin vectorul de la taskul 5
typename vector<struct Route>::iterator it;
cin >> N >> M;
// Cele 2 tabele de dispersie
Hashtable<string, int> encode(N, &charHashingFunction);
Hashtable<int, string> decode(N, &hashingFunction);
// Parametru pentru constructorul grafului, adaugă date în fiecare nod.
int nodes[N];
// Vectorul de marcare a benzinăriilor pentru taskul 4
int gas[N] = {0};
/**
* Citire nodurilor din graf (numele orașelor) și indexarea lor în tabelele
* de dispersie.
*/
for (i = 0; i < N; ++i) {
cin >> name;
encode.put(name, i);
decode.put(i, name);
nodes[i] = i;
}
// Graful hartă
Graph<int> map(N, nodes);
// Graful transpus
Graph<int> transpose(N, nodes);
// Citirea muchiilor din graf (autostrăzile)
for (i = 0; i < M; ++i) {
cin >> src >> dst;
indexSRC = encode.get(src);
indexDST = encode.get(dst);
map.addEdge(indexSRC, indexDST);
transpose.addEdge(indexDST, indexSRC);
}
// Rezolvare Task 1
task1(&map, &decode);
// Rezolvare Task 2
task2(&map, &transpose);
// Citirea orașelor cu benzinării și marcarea lor în vectorul gas.
cin >> B;
for (i =0; i < B; ++i) {
cin >> station;
gas[encode.get(station)] = 1;
}
// Rezolvare Task 3
ofstream fout("task3.out");
cin >> K;
/**
* Dacă harta este validă citesc cele K orașe doar pentru a muta cursorul
* în fișier.
*/
if (map.numConnectedComponents == 1 &&
transpose.numConnectedComponents == 1) {
fout << "Exista drum intre oricare doua orase\n";
for (i = 0; i < K; ++i) {
cin >> isolated;
}
/**
* Altfel, citesc cele K orașe, le caut indexul întreg în tabelul de
* dispersie și apelez funcția de rezolvare.
*/
} else {
for (i = 0; i < K; ++i) {
cin >> isolated;
int index = encode.get(isolated);
task3(N, K, index, isolated, &map, &transpose, &decode, fout);
}
}
fout.close();
// Rezolvare Task 4
cin >> L;
ofstream out("task4.out");
for (i = 0; i < L; ++i) {
cin >> journey.cityName
>> journey.fuel
>> journey.consumption;
task4(N, L, B, gas, journey, &map, &encode, out);
}
out.close();
// Rezolvare Task 5
cin >> P;
vector<struct Route> route(P);
// Citesc cele P orașe și le sortez după orașul sursă și orașul destinație.
for (i = 0; i < P; ++i) {
cin >> route[i].src >> route[i].dst >> route[i].passangers;
}
sort(route.begin(), route.end(), sortFunc);
/**
* Fiind soartat, dacă exită 2 autobuze între aceleași 2 orașe, acestea vor
* poziționate unul lângă altul în vector. Adun numărul de pasageri pentru
* acestea.
*/
for (i = 0; i < P - 1; ++i) {
if (route[i].src == route[i + 1].src &&
route[i].dst == route[i + 1].dst) {
route[i].passangers += route[i + 1].passangers;
route[i + 1].passangers = route[i].passangers;
}
}
// Calculez numărul maxim de pasageri și afișez traseul pentru acele curse.
it = max_element(route.begin(), route.end(), maxim);
task5(encode.get(it->src),
encode.get(it->dst),
it->passangers,
&map, &decode);
return 0;
}