diff options
| author | Thomas Schmucker <ts@its1.de> | 2025-12-08 12:43:10 +0100 |
|---|---|---|
| committer | Thomas Schmucker <ts@its1.de> | 2025-12-08 12:43:10 +0100 |
| commit | 2e9d0706ec4cdfa7171dd079d497cd81ee03bd36 (patch) | |
| tree | 03a82ccf9d3b0f5cb4e83b17af734e6e3f26bb89 /2025 | |
| parent | 3447cd58384cce987f6acd503a5202b3aa65c02d (diff) | |
| download | advent-of-code-2e9d0706ec4cdfa7171dd079d497cd81ee03bd36.tar.gz advent-of-code-2e9d0706ec4cdfa7171dd079d497cd81ee03bd36.tar.bz2 advent-of-code-2e9d0706ec4cdfa7171dd079d497cd81ee03bd36.zip | |
aoc 2025, day 8, part 2
Diffstat (limited to '2025')
| -rw-r--r-- | 2025/src/day08.cpp | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/2025/src/day08.cpp b/2025/src/day08.cpp index 366d827..7a3c3b1 100644 --- a/2025/src/day08.cpp +++ b/2025/src/day08.cpp | |||
| @@ -28,12 +28,16 @@ public: | |||
| 28 | return parent_[n]; | 28 | return parent_[n]; |
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | void unite(size_t a, size_t b) | 31 | bool unite(size_t a, size_t b) |
| 32 | { | 32 | { |
| 33 | a = find(a); | 33 | a = find(a); |
| 34 | b = find(b); | 34 | b = find(b); |
| 35 | 35 | ||
| 36 | parent_[b] = a; | 36 | if ( a != b ) { |
| 37 | parent_[b] = a; | ||
| 38 | return true; | ||
| 39 | } | ||
| 40 | return false; | ||
| 37 | } | 41 | } |
| 38 | 42 | ||
| 39 | private: | 43 | private: |
| @@ -112,6 +116,35 @@ part1(const vector<Pos>& list) | |||
| 112 | cout << "Part 1: " << sizes[0] * sizes[1] * sizes[2] << '\n'; | 116 | cout << "Part 1: " << sizes[0] * sizes[1] * sizes[2] << '\n'; |
| 113 | } | 117 | } |
| 114 | 118 | ||
| 119 | void | ||
| 120 | part2(const vector<Pos>& list) | ||
| 121 | { | ||
| 122 | using Dist = tuple<double, size_t, size_t>; // (Distanz, Von, Nach) | ||
| 123 | |||
| 124 | // Distanzen paarweise erfassen... | ||
| 125 | vector<Dist> dists; | ||
| 126 | for ( size_t i = 0; i != list.size(); ++i ) { | ||
| 127 | for ( size_t j = i + 1; j != list.size(); ++j ) { | ||
| 128 | dists.emplace_back(get_distance(list[i], list[j]), i, j); | ||
| 129 | } | ||
| 130 | } | ||
| 131 | |||
| 132 | // ... und nach Distanz sortieren | ||
| 133 | ranges::sort(dists); | ||
| 134 | |||
| 135 | UnionFind unionFind(list.size()); | ||
| 136 | |||
| 137 | size_t count = 1; | ||
| 138 | for ( auto [dist, a, b]: dists ) { | ||
| 139 | if ( unionFind.unite(a, b) ) { | ||
| 140 | if ( ++count == list.size() ) { | ||
| 141 | cout << "Part 2: " << get<0>(list[a]) * get<0>(list[b]) << '\n'; | ||
| 142 | return; | ||
| 143 | } | ||
| 144 | } | ||
| 145 | } | ||
| 146 | } | ||
| 147 | |||
| 115 | } // namespace | 148 | } // namespace |
| 116 | 149 | ||
| 117 | int | 150 | int |
| @@ -119,4 +152,5 @@ main() | |||
| 119 | { | 152 | { |
| 120 | auto data = read_file("data/day08.txt"); | 153 | auto data = read_file("data/day08.txt"); |
| 121 | part1(data); | 154 | part1(data); |
| 155 | part2(data); | ||
| 122 | } | 156 | } |
