-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path12.cpp
90 lines (71 loc) · 2.03 KB
/
12.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
#include <algorithm>
#include <chrono>
#include <iostream>
#include <string>
#include <vector>
using std::string;
using std::vector;
int count_in_group(const vector<vector<int>> &programs, vector<bool> &seen,
const int name) {
int count = 1;
const vector<int> &connections = programs.at(name);
seen[name] = true;
for (const int conn : connections) {
if (seen[conn]) {
continue;
}
count += count_in_group(programs, seen, conn);
}
return count;
}
int count_groups(const vector<vector<int>> &programs) {
int groups = 0;
vector<bool> seen(programs.size());
for (unsigned int p = 0; p < programs.size(); p++) {
if (seen[p]) {
continue;
}
groups += 1;
// re-use function from part 1
// to recursively (dfs) mark all programs in this group as seen
count_in_group(programs, seen, p);
}
return groups;
}
vector<vector<int>> parse_input() {
string input;
vector<vector<int>> programs;
programs.reserve(2000);
while (std::getline(std::cin, input)) {
auto it = input.begin();
auto end = std::find(it, input.end(), '>');
vector<int> conns;
while (end != input.end()) {
it = end + 2;
end = std::find(it, input.end(), ',');
int c = std::stoi(&(*it));
conns.push_back(c);
}
programs.push_back(conns);
}
return programs;
}
int main() {
int pt1 = 0;
int pt2 = 0;
const auto tstart = std::chrono::high_resolution_clock::now();
vector<vector<int>> programs = parse_input();
vector<bool> seen(programs.size());
pt1 = count_in_group(programs, seen, 0);
pt2 = count_groups(programs);
std::cout << "--- Day 12: Digital Plumber ---\n";
std::cout << "Part 1: " << pt1 << "\n";
std::cout << "Part 2: " << pt2 << "\n";
auto tstop = std::chrono::high_resolution_clock::now();
auto duration =
std::chrono::duration_cast<std::chrono::microseconds>(tstop - tstart);
std::cout << "Time: " << (static_cast<double>(duration.count()) / 1000.0)
<< " ms"
<< "\n";
return EXIT_SUCCESS;
}