-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.cpp
103 lines (95 loc) · 3.35 KB
/
main.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
99
100
101
102
103
#include <vector>
#include <fstream>
#include <iostream>
#include <map>
#include <sstream>
#include <stdlib.h>
class Road {
public:
std::string name;
int priority;
int max_speed;
int num_lanes;
int oneway;
int numpoints;
int numnodes;
int recurringNodes;
std::map<std::pair<float, float>, int> points;
Road(std::string name, int priority, int max_speed, int num_lanes, int oneway, int numpoints,
std::map<std::pair<float, float>, int> points, int numnodes, int recurringNodes) :
name(name), priority(priority), max_speed(max_speed), num_lanes(num_lanes), oneway(oneway),
numpoints(numpoints), points(points), numnodes(numnodes), recurringNodes(recurringNodes) {
}
};
int getArcsNumber(std::vector<Road> roads, std::map<std::pair<float, float>, int> nodes, std::map<std::pair<float, float>, int> points) {
int arcs = 0;
for (int i = 0; i < roads.size(); i++) {
for(std::map<std::pair<float ,float>, int>::iterator it = roads[i].points.begin(); it != roads[i].points.end(); ++it) {
if (points[it->first] > 0){
if (roads[i].oneway)
arcs += (nodes[it->first] - 1) / 2;
else
arcs += (nodes[it->first] - 1);
}
}
}
return arcs;
}
int getArcsDurationSum(std::vector<Road> roads) {
return 0;
}
void parseFile(char *filename) {
std::vector<Road> roads;
std::ifstream classFile(filename);
std::string lineBuffer, buffer;
std::map<std::pair<float, float>, int> points;
std::map<std::pair<float, float>, int> nodes;
while (getline(classFile, lineBuffer)) {
int i = 0;
int originalNodeSize = (int) nodes.size();
int recurringNodes = 0;
std::string name;
std::stringstream stream;
std::vector<float> params;
std::map<std::pair<float, float>, int> roadPoints;
//
params.clear();
roadPoints.clear();
stream.clear();
stream.str(lineBuffer);
//
while (getline(stream, buffer, ',')) {
if (0 == i++)
name = buffer;
else {
params.push_back(atof(buffer.c_str()));
}
}
for (int j = 5; j < params.size(); j += 2) {
bool exists = false;
std::pair<float, float> pair = std::make_pair(params[j], params[j + 1]);
points[pair]++;
roadPoints[pair]++;
if (j == 5) {
nodes[std::make_pair(params[j], params[j + 1])]++;
} else if (j == (params.size() - 2)) {
nodes[std::make_pair(params[j], params[j + 1])]++;
} else if (points[pair] > 1) {
nodes[std::make_pair(params[j], params[j + 1])]++;
}
}
Road road = Road(name, (int) params[0], (int) params[1], (int) params[2], (int) params[3], (int) params[4],
roadPoints, (int) nodes.size() - originalNodeSize, recurringNodes);
roads.push_back(road);
}
std::cout << nodes.size() << std::endl;
std::cout << getArcsNumber(roads, nodes, points) << std::endl;
std::cout << getArcsDurationSum(roads) << std::endl;
}
int main(int argc, char **argv) {
std::map<std::pair<float, float>, int> points;
if (argc < 2)
return -1;
parseFile(argv[1]);
return 0;
}