From 817e5634bd195643b9b3b62e755fc574287e5207 Mon Sep 17 00:00:00 2001 From: oncsr Date: Fri, 9 May 2025 10:53:09 +0900 Subject: [PATCH] =?UTF-8?q?[20250509]=20BOJ=20/=20D5=20/=20Confuzzle=20/?= =?UTF-8?q?=20=EA=B6=8C=ED=98=81=EC=A4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- khj20006/202505/09 BOJ D5 Confuzzle.md | 50 ++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 khj20006/202505/09 BOJ D5 Confuzzle.md diff --git a/khj20006/202505/09 BOJ D5 Confuzzle.md b/khj20006/202505/09 BOJ D5 Confuzzle.md new file mode 100644 index 00000000..e828b70e --- /dev/null +++ b/khj20006/202505/09 BOJ D5 Confuzzle.md @@ -0,0 +1,50 @@ +```cpp +#include +#include +#include +#include +#include +using namespace std; + +int N, INF = 1e9 + 7, ans = INF, C[100001]{}; +vector> V(100001); +map> M[100001]{}; + +void dfs(int n, int p) { + for (int i : V[n]) if (i != p) { + dfs(i, n); + C[i]++; + if (M[i].size() > M[n].size()) swap(M[i], M[n]), swap(C[i], C[n]); + for (auto[c, d] : M[i]) { + auto[fir, sec] = d; + if (M[n].find(c) == M[n].end()) M[n][c] = { fir + C[i] - C[n], sec + C[i] - C[n] }; + else { + 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]; + else if (fir < M[n][c].second) M[n][c].second = fir + C[i] - C[n]; + if (sec < M[n][c].second) M[n][c].second = sec + C[i] - C[n]; + } + ans = min(ans, M[n][c].first + M[n][c].second + 2*C[n]); + } + M[i] = map>(); + } +} + +int main() { + cin.tie(0)->sync_with_stdio(0); + + cin >> N; + for (int i = 1, a; i <= N; i++) { + cin >> a; + M[i][a] = { 0,INF }; + } + for (int i = 1, a, b; i < N; i++) { + cin >> a >> b; + V[a].push_back(b); + V[b].push_back(a); + } + + dfs(1, 0); + cout << ans; + +} +```