Skip to content

Commit 817e563

Browse files
authored
[20250509] BOJ / D5 / Confuzzle / 권혁준
1 parent 1f591f7 commit 817e563

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
```cpp
2+
#include <iostream>
3+
#include <vector>
4+
#include <map>
5+
#include <utility>
6+
#include <algorithm>
7+
using namespace std;
8+
9+
int N, INF = 1e9 + 7, ans = INF, C[100001]{};
10+
vector<vector<int>> V(100001);
11+
map<int, pair<int, int>> M[100001]{};
12+
13+
void dfs(int n, int p) {
14+
for (int i : V[n]) if (i != p) {
15+
dfs(i, n);
16+
C[i]++;
17+
if (M[i].size() > M[n].size()) swap(M[i], M[n]), swap(C[i], C[n]);
18+
for (auto[c, d] : M[i]) {
19+
auto[fir, sec] = d;
20+
if (M[n].find(c) == M[n].end()) M[n][c] = { fir + C[i] - C[n], sec + C[i] - C[n] };
21+
else {
22+
if (fir + C[i] < M[n][c].first + C[n]) M[n][c].second = M[n][c].first, M[n][c].first = fir + C[i] - C[n];
23+
else if (fir < M[n][c].second) M[n][c].second = fir + C[i] - C[n];
24+
if (sec < M[n][c].second) M[n][c].second = sec + C[i] - C[n];
25+
}
26+
ans = min(ans, M[n][c].first + M[n][c].second + 2*C[n]);
27+
}
28+
M[i] = map<int, pair<int, int>>();
29+
}
30+
}
31+
32+
int main() {
33+
cin.tie(0)->sync_with_stdio(0);
34+
35+
cin >> N;
36+
for (int i = 1, a; i <= N; i++) {
37+
cin >> a;
38+
M[i][a] = { 0,INF };
39+
}
40+
for (int i = 1, a, b; i < N; i++) {
41+
cin >> a >> b;
42+
V[a].push_back(b);
43+
V[b].push_back(a);
44+
}
45+
46+
dfs(1, 0);
47+
cout << ans;
48+
49+
}
50+
```

0 commit comments

Comments
 (0)