-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathConnectedGraph.cpp
98 lines (81 loc) · 3.11 KB
/
ConnectedGraph.cpp
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
#include "ConnectedGraph.h"
ConnectedGraph::ConnectedGraph(int nodes) : nodes(nodes + 1) {}
double ConnectedGraph::calculateDistance(double lat1, double lon1, double lat2, double lon2) {
double dLat = (lat2 - lat1) * M_PI / 180.0;
double dLon = (lon2 - lon1) * M_PI / 180.0;
lat1 = (lat1) * M_PI / 180.0;
lat2 = (lat2) * M_PI / 180.0;
double a = pow(sin(dLat / 2), 2) + pow(sin(dLon / 2), 2) * cos(lat1) * cos(lat2);
double rad = 6371;
double c = 2 * asin(sqrt(a));
return rad * c;
}
void ConnectedGraph::addNode(const Node &node, int index) {
this->nodes[index] = node;
}
void ConnectedGraph::addEdge(int departure, int arrival, Flight flight) {
if (departure < 1 || arrival > nodes.size() || departure > nodes.size() || arrival < 1) return;
nodes[departure].adjacent.push_back({arrival, calculateDistance(nodes[departure].airport.getLatitude(),
nodes[departure].airport.getLongitude(),
nodes[arrival].airport.getLatitude(),
nodes[arrival].airport.getLongitude()), flight});
}
Node ConnectedGraph::getNode(int index) {
return nodes[index];
}
void ConnectedGraph::sortEdges(int index) {
nodes[index].adjacent.sort([](Edge e1, Edge e2){
return e1.weight < e2.weight;
});
}
void ConnectedGraph::BFS(int departure, const vector<string>& airlines) {
for (int i = 1 ; i < nodes.size() ; i++) {
nodes[i].visited = false;
nodes[i].distance = 0;
nodes[i].parent = i;
nodes[i].km = 0;
}
queue<int> visitedNodes = {};
visitedNodes.push(departure);
nodes[departure].visited = true;
nodes[departure].distance = 0;
while (!visitedNodes.empty()) {
int node = visitedNodes.front();
visitedNodes.pop();
for (const Edge &edge : nodes[node].adjacent) {
int n = edge.dest;
double w = edge.weight;
Flight f = edge.flight;
if (!airlines.empty()) {
bool check = false;
for (const string& s: airlines) {
if (s != f.getAirline()->getCode()) {
continue;
} else {check = true;
break;}
}
if (!check) {continue;}
}
if (!nodes[n].visited) {
visitedNodes.push(n);
nodes[n].visited = true;
nodes[n].distance = nodes[node].distance + 1;
nodes[n].parent = node;
nodes[n].currentFlight = edge.flight;
nodes[n].km = nodes[node].km + w;
}
}
}
}
vector<Node> ConnectedGraph::makePath(int departure, int arrival, const vector<string>& airlines) {
vector<Node> path = {};
BFS(departure, airlines);
if (nodes[arrival].km == INF) return path;
int i = arrival;
path.push_back(nodes[i]);
while (i != departure) {
i = nodes[i].parent;
path.push_back(nodes[i]);
}
return path;
}