Skip to main content

Tree

BOJ 31740 Split the SSHS 3

·193 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/31740 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ๊ทธ๋ž˜ํ”„๋Š” ํŠธ๋ฆฌ๋กœ ๋ณด์ธ๋‹ค. ํŠธ๋ฆฌ์—์„œ๋Š” ๋ชจ๋“  ๊ฐ„์„ ์ด ๋‹จ์ ˆ์„ ์ด๋ฏ€๋กœ ํ•˜๋‚˜๋งŒ ์ž˜๋ผ๋„ ๋‘ ์ปดํฌ๋„ŒํŠธ๋กœ ๋‚˜๋‰˜๋Š”๊ฒƒ์ด ์ž๋ช…ํ•˜๋‹ค. ๊ฐ„์„ ์„ ํ•˜๋‚˜ ์ž๋ฅด๊ณ  ๋‚˜๋ฉด ์„œ๋ธŒํŠธ๋ฆฌ ํ•˜๋‚˜์™€ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰œ๋‹ค. ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๊ฐ€์ค‘์น˜๋Š” ํŠธ๋ฆฌDP๋ฅผ ํ™œ์šฉํ•ด ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ด๋‘˜ ์ˆ˜ ์žˆ๊ณ , ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ์ „์ฒด ๊ฐ€์ค‘์น˜ ํ•ฉ์—์„œ ํ•ด๋‹น ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๊ฐ€์ค‘์น˜ ํ•ฉ๋งŒํผ์„ ๋นผ๋ฉด ๋œ๋‹ค. $O(N)$์— ๊ณ„์‚ฐ ๊ฐ€๋Šฅํ•ด๋ณด์ธ๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): int dfs(int c, int p){ par[c] = p; DP[c] = W[c]; for(auto nxt : links[c]){ if(nxt == p) continue; DP[c] += dfs(nxt, c); } return DP[c]; } void solve(){ cin >> N; rep(i, 0, N-1){ int u, v; cin >> u >> v; links[u].push_back(v); links[v].push_back(u); } rep(i, 1, N+1) cin >> W[i]; int SUM = dfs(1, -1); int ans = 2e9; pii ans2 = {-1, -1}; rep(i, 2, N+1) if(ans > abs(DP[i] - (SUM - DP[i]))){ ans = abs(DP[i] - (SUM - DP[i])); ans2 = {i, par[i]}; } cout << ans << '\n'; cout << ans2.first << ' ' << ans2.second << '\n'; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 30208 ํœด๊ฐ€ ๋‚˜๊ฐ€๊ธฐ

·244 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/30208 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์—…๋ฌด๋“ค์˜ ์ˆœ์„œ๋•Œ๋ฌธ์—, ์ž์œ ๋กญ๊ฒŒ ์„ ํƒํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋“ค์ด ์ƒ๊ธด๋‹ค. ์ด๊ฒŒ ์–ด๋–ค ๋А๋‚Œ์ด์ง€? ![[Drawing 2026-02-07 15.51.45.excalidraw.png]] ์˜ˆ์ œ ์ž…๋ ฅ 1์˜ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. $1 \rightarrow 2 \rightarrow 3$์„ ๋ณด์ž. $1$๊นŒ์ง€ ์ˆ˜ํ–‰ํ•ด์„œ ์ค‘์š”๋„ $w_1$, ์ฒ˜๋ฆฌ์‹œ๊ฐ„ $t_1$์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. $2$๊นŒ์ง€ ์ˆ˜ํ–‰ํ•ด์„œ ์ค‘์š”๋„ $w_1 + w_2$, ์ฒ˜๋ฆฌ์‹œ๊ฐ„ $t_1 + t_2$๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. $3$๊นŒ์ง€ ์ˆ˜ํ–‰ํ•ด์„œ $\cdots$ ์ €๋ ‡๊ฒŒ ๋ฌผ๊ฑด์„ ๋งŒ๋“ค๊ณ  ๋‚˜๋ฉด, ์„ธ๊ฐœ์ค‘์—์„œ ํƒ1์„ ํ•˜๋Š”๊ฒƒ ๋นผ๊ณ ๋Š” ๋ฐฐ๋‚ญ๋ฌธ์ œ์™€ ๋™์ผํ•ด์ง„๋‹ค. ํŠธ๋ฆฌ dfs๋กœ ๋ƒ…์ƒ‰์„ ์ž˜ ๋Œ๋ฉด์„œ DP๋ฅผ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทผ๋ฐ ์•ˆ์—์„œ ๋ถ„๊ธฐ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด… 0์ด ์•„๋‹Œ ๋ชจ๋“  $p_i$๋“ค์€ ๋ชจ๋‘ ๋‹ค๋ฅด๋‹ค ๋ผ๋Š” ๋ฌธ์žฅ์ด ์ž…๋ ฅ์— ์žˆ๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void dfs(int cur, int root, int w, int t){ w += W[cur]; t += T[cur]; bags[root].push_back({w, t}); for(auto nxt: links[cur]) dfs(nxt, root, w, t); } void solve(){ cin >> N >> S; rep(i, 1, N+1) cin >> W[i]; rep(i, 1, N+1) cin >> T[i]; rep(i, 1, N+1){ int p; cin >> p; links[p].push_back(i); } for(auto nxt: links[0]) dfs(nxt, nxt, 0, 0); rep(i, 0, N+2) rep(j, 0, S+1) KS[i][j] = 1e9; KS[0][0] = 0; rep(i, 0, N+1) rep(j, 0, S+1) { KS[i+1][j] = min(KS[i+1][j], KS[i][j]); for(auto [w, t]: bags[i]){ int nxt = min(S, j + w); // } KS[i+1][nxt] = min(KS[i+1][nxt], KS[i][j] + t); } } if(KS[N+1][S] == 1e9) cout << -1; else cout << KS[N+1][S]; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 1734 ๊ตํ†ต ์ฒด๊ณ„

·405 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/1734 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋ฌดํ–ฅ ๊ทธ๋ž˜ํ”„ $G = (V, E)$๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์—ฌ๊ธฐ์„œ ๋‘๊ฐ€์ง€ ์ฟผ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ„์„  $e \in E$ ํ•˜๋‚˜๋ฅผ ์—†์•ด์„ ๋•Œ, ์ •์  $A, B$์˜ ์—ฐ๊ฒฐ์„ฑ ํŒ์ • ์ •์  $v \in V$ ํ•˜๋‚˜๋ฅผ ์—†์•ด์„ ๋•Œ, ์ •์  $A, B$์˜ ์—ฐ๊ฒฐ์„ฑ ํŒ์ • ๊ฐ๊ฐ ์‚ดํŽด๋ณด์ž. ๋จผ์ €, ๋ฌธ์ œ์กฐ๊ฑด์— ์˜ํ•ด ์ปดํฌ๋„ŒํŠธ๋Š” ํ•˜๋‚˜์ด๋ฏ€๋กœ A, B๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜์ž.

BOJ 3176 ๋„๋กœ ๋„คํŠธ์›Œํฌ

·146 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/3176 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋„๋กœ๊ฐ€ N-1๊ฐœ์ธ๊ฑธ ๋ณด๋‹ˆ ํŠธ๋ฆฌ๊ฒ ๊ตฌ๋งŒ ์ด๋•Œ ๊ฒฝ๋กœ์ƒ์—์„œ ๊ฐ€์žฅ ์งง์€ ๋„๋กœ์˜ ๊ธธ์ด์™€ ๊ฐ€์žฅ ๊ธด ๋„๋กœ์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•˜๋ผ๋Š”๋ฐ… HLD๋ฅผ ์จ๋„ ๋˜์ง€๋งŒ, sparse table์—์„œ์˜ RMQ์ฒ˜๋ฆฌ์ฒ˜๋Ÿผ ์ง„ํ–‰ํ•ด๋„ ํฐ ๋ฌธ์ œ๊ฐ€ ์—†๊ฒ ๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ cin >> N; rep(i, 0, N-1){ int u, v, w; cin >> u >> v >> w; links[u].push_back({v, w}); links[v].push_back({u, w}); } dfs(1, -1, 0); rep(j, 1, 20) rep(i, 1, N+1) if(par[i][j-1]){ par[i][j] = par[par[i][j-1]][j-1]; mnDist[i][j] = min(mnDist[i][j-1], mnDist[par[i][j-1]][j-1]); mxDist[i][j] = max(mxDist[i][j-1], mxDist[par[i][j-1]][j-1]); } int Q; cin >> Q; while(Q--){ int u, v; cin >> u >> v; auto [mn, mx] = calc(u, v); cout << mn << ' ' << mx << '\n'; } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 1761 ์ •์ ๋“ค์˜ ๊ฑฐ๋ฆฌ

·226 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/1761 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ํŠธ๋ฆฌ์—์„œ, ๋‘ ์ •์  ์‚ฌ์ด์˜ ๊ฒฝ๋กœ๋Š” ์œ ์ผํ•˜๋‹ค. ํ•ด๋‹น ๊ฒฝ๋กœ๋Š” ๋‘ ์ •์ ์˜ LCA๋ฅผ ์ง€๋‚œ๋‹ค. ๋‘ ์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋Š” $d(u) + d(v) - 2*d(\text{LCA}(u, v))$๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void dfs(int cur, int _par){ for(auto [nxt, w]: links[cur]){ if(nxt == _par) continue; dist[nxt] = dist[cur] + w; depth[nxt] = depth[cur] + 1; par[nxt][0] = cur; dfs(nxt, cur); } } int LCA(int u, int v){ if(u == v) return u; if(depth[u] < depth[v]) swap(u, v); int diff = depth[u] - depth[v]; rep(i, 0, 16) if((diff >> i) & 1) u = par[u][i]; if(u == v) return u; rrep(i, 16, 0){ if(par[u][i] != par[v][i]){ u = par[u][i]; v = par[v][i]; } } return par[u][0]; } ll getDist(int u, int v){ int lca = LCA(u, v); return dist[u] + dist[v] - 2 * dist[lca]; } void solve(){ cin >> N; rep(i, 0, N-1){ int u, v, w; cin >> u >> v >> w; links[u].push_back({v, w}); links[v].push_back({u, w}); } dfs(1, -1); rep(j, 1, 16) rep(i, 1, N+1) par[i][j] = par[par[i][j-1]][j-1]; cin >> Q; while(Q--){ int u, v; cin >> u >> v; cout << getDist(u, v) << '\n'; } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 14675 ๋‹จ์ ˆ์ ๊ณผ ๋‹จ์ ˆ์„ 

·118 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/14675 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ํŠธ๋ฆฌ์—์„œ์˜ ๋‹จ์ ˆ์ ๊ณผ ๋‹จ์ ˆ์„ ์„ ์ƒ๊ฐํ•ด๋ณด์ž. ํŠธ๋ฆฌ์—์„œ ๋ชจ๋“  ๊ฐ„์„ ์€ ๋‹จ์ ˆ์„ ์ด๋‹ค. ์‚ฌ์ดํด ์—†๋Š” ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„๋‹ˆ๊นŒ ํŠธ๋ฆฌ์—์„œ ๋ฆฌํ”„๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋…ธ๋“œ๋Š” ๋‹จ์ ˆ์ ์ด๋‹ค. ์œ„์™€ ์ด์œ ๊ฐ€ ๊ฐ™๋‹ค. ์šฐํšŒ๊ฒฝ๋กœ๋กœ ์“ธ back edge๊ฐ€ ์—†๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ cin >> N; rep(i, 0, N-1){ int u, v; cin >> u >> v; links[u].push_back(v); links[v].push_back(u); } cin >> Q; while(Q--){ int t, k; cin >> t >> k; if(t == 1) cout << ((int)links[k].size() == 1 ? "no\n" : "yes\n"); else cout << "yes\n"; } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 30690 ์„ ๋กœ ์กฐ๋ฆฝ

·340 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/30690 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์•”ํŠผ ํŠธ๋ฆฌ๊ฐ€ ์žˆ๋‹ค ๊ฐ„์„  ํ•˜๋‚˜๋ฅผ ๋–ผ๊ณ  ๋‹ค์‹œ ์—ฐ๊ฒฐํ•ด์„œ, ๊ฐ€์žฅ ๋งŽ์€ ๊ฐ„์„ ์„ ์ง€๋‚˜๊ฐ€๊ณ ์‹ถ๋‹ค. ๊ฐ„์„  ํ•˜๋‚˜๋ฅผ ๋–ผ๊ณ  ๋‹ค์‹œ ์—ฐ๊ฒฐํ•ด์„œ, ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์„ ์ตœ๋Œ€๋กœ ํ•˜๊ณ  ์‹ถ๋‹ค. ์ชผ๊ฐœ์ง„ ๋‘๊ฐœ์˜ ํŠธ๋ฆฌ์—์„œ, ๊ฐ๊ฐ์˜ ์ง€๋ฆ„ + 1์ด ๋‹ต์ด๋‹ค. ํŠธ๋ฆฌ๋ฅผ ์“ฐ๋Š” ํŠธ๋ฆฌ ๋ฌธ์ œ ํ•ด๋‹น ๋ฌธ์ œ์—์„œ, ํ•ด๋‹น ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ์ œ์™ธํ•œ ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋Š” ๋ฆฌ๋ฃจํŒ…๊ณผ ๋ถ€๋ชจ๊นŠ์ด, ๋‹ค๋ฅธ ์ž์‹์˜ ๊นŠ์ด ๋‘๊ฐœ์ •๋„๋ฅผ ์ž˜ ๋“ค๊ณ ์žˆ์œผ๋ฉด ๊ฐ€๋Šฅํ•˜๊ฒ ๋‹ค. ๋‹ค๋ฅธ ์ž์‹์˜ ์ง€๋ฆ„๋„ ๋“ค๊ณ ์žˆ์–ด์•ผ ํ•œ๋‹ค!! ์˜ˆ์ œ ํŠธ๋ฆฌ ๊ทธ๋ฆผ ![[Drawing 2026-01-26 17.35.39.excalidraw.png]] ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): int N, Q; vector<int> links[200010]; int depth[200010]; vector<pii> childs[200010]; // {mxDepth, nodeIdx} vector<pii> childs2[200010]; // {mxDiam, nodeIdx} int diam[200010], upDepth[200010], upDiam[200010]; void dfs1(int cur, int par){ vector<pii> ret; ret.push_back({0, cur}); for(auto nxt: links[cur]){ if(nxt == par) continue; depth[nxt] = depth[cur] + 1; dfs1(nxt, cur); diam[cur] = max(diam[cur], diam[nxt]); ret.push_back({childs[nxt][0].first + 1, nxt}); sort(all(ret), greater<pii>()); if((int)ret.size() > 3) ret.pop_back(); childs2[cur].push_back({diam[nxt], nxt}); sort(all(childs2[cur]), greater<pii>()); if((int)childs2[cur].size() > 2) childs2[cur].pop_back(); } childs[cur] = ret; if((int)ret.size() >= 2) diam[cur] = max(diam[cur], ret[0].first + ret[1].first); if((int)ret.size() >= 1) diam[cur] = max(diam[cur], ret[0].first); } void dfs2(int cur, int par, int mxUp){ for(auto nxt: links[cur]){ if(nxt == par) continue; vector<int> candidates; candidates.push_back(mxUp); for(auto [d, idx]: childs[cur]) if(idx != nxt) candidates.push_back(d); sort(all(candidates), greater<int>()); if((int)candidates.size() >= 2) upDiam[nxt] = max(upDiam[nxt], candidates[0] + candidates[1]); if((int)candidates.size() >= 1) upDiam[nxt] = max(upDiam[nxt], candidates[0]); for(auto [d, idx]: childs2[cur]) if(idx != nxt) upDiam[nxt] = max(upDiam[nxt], d); upDiam[nxt] = max(upDiam[nxt], upDiam[cur]); dfs2(nxt, cur, candidates[0] + 1); } } void solve(){ cin >> N >> Q; rep(i, 0, N-1){ int u, v; cin >> u >> v; links[u].push_back(v); links[v].push_back(u); } dfs1(1, -1); dfs2(1, -1, 0); // rep(i, 1, N+1) cout << diam[i] << " "; cout << "\n"; // rep(i, 1, N+1) cout << upDiam[i] << " "; cout << "\n"; while(Q--){ int u, v; cin >> u >> v; if(depth[u] < depth[v]) swap(u, v); cout << diam[u] + upDiam[u] + 1 << "\n"; } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 32144 ํŠธ๋ฆฌ๋ฅผ ์“ฐ๋Š” ํŠธ๋ฆฌ ๋ฌธ์ œ

·358 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/32144 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋ฌธ์ œ์— ๋‚ด ์ด๋ฆ„์ด ๋‚˜์™€์„œ ๊ธฐ๋ถ„์ด ์ข‹๋‹ค. ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ํ•˜๋‚˜ ์žก์•„์„œ, ๊ทธ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋ฃจํŠธ์™€ ๊ทธ ๋ถ€๋ชจ์™€์˜ ์—ฐ๊ฒฐ์„ ๋Š๊ณ  ์„œ๋ธŒํŠธ๋ฆฌ์˜ ์ž„์˜์˜ ์ •์ ๊ณผ ๋ฐฉ๊ธˆ ๋Š์€ ๋ถ€๋ชจ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์—ฐ์‚ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ง๊ด€์ ์œผ๋กœ, ํ•ด๋‹น ์„œ๋ธŒํŠธ๋ฆฌ์—์„œ ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ธธ์ด์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ๊นŠ์ด์—์„œ ์ง€๋ฆ„์œผ๋กœ ๋ฐ”๋€œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. Tree DP๋ฅผ ์ด์šฉํ•œ ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„ ๊ตฌํ•˜๊ธฐ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. ![[Drawing 2026-01-25 10.09.49.excalidraw.png]] ์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ™์€๊ฒŒ ๋ฐœ์ƒํ•  ๊ฒƒ ๊ฐ™๋‹ค. ๋‘๋ฒˆ์งธ๋กœ ์ž‘์€ ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๊ธฐ์กด ์ง€๋ฆ„์˜ ์–‘ ๋ ์ ์ค‘ ํ•œ ์ ์€ ์œ ์ง€๋œ๋‹ค. …์ธ์ค„์•Œ์•˜๋Š”๋ฐ ์•ˆ๋œ๋‹ค. ![[Drawing 2026-01-25 11.07.01.excalidraw.png]] ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„œ๋ธŒ๋…ธ๋“œ ์•ˆ์— ๊ธฐ์กด ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์ด ๋‹ค ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค… ๊ฒฐ๊ตญ ๋ฌธ์ œ์—์„œ๋„ ๋งํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ฌธ์ œ๋ฅผ ๋ถ€๋ถ„ํŠธ๋ฆฌ์™€ ๊ทธ ๋‚˜๋จธ์ง€๋กœ ๋ณด๋ฉด, ๋ฆฌ๋ฃจํŒ…์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์„๊นŒ? ๋ฆฌ๋ฃจํŒ…์„ ์ด์šฉํ•ด์„œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ž. ์„œ๋ธŒํŠธ๋ฆฌ์˜ ์ง€๋ฆ„ ํ•ด๋‹น ์„œ๋ธŒํŠธ๋ฆฌ์—์„œ ๊ฐ€์žฅ ๊นŠ์€ ๊นŠ์ด ๋‘๊ฐœ (๋ฆฌ๋ฃจํŒ…์šฉ) ํ•ด๋‹น ๋…ธ๋“œ์—์„œ ์œ„๋กœ ๊ฐ”์„๋•Œ, ๊ฐ€์žฅ ๊นŠ์€ ๊ธธ์ด ์ด๋Š” dfs๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๊ณ , ์‹œ๊ฐ„๋ณต์žก๋„๋Š” $O(N)$์ด๋‹ค. ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ์˜ˆ์ œ 2๋ฒˆ ๊ทธ๋ฆผ ![[Drawing 2026-01-25 10.30.52.excalidraw.png]] ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): int N; vector<int> links[300005]; vector<pii> max_depth[300005]; int diam[300005]; int updepth[300005], updiam[300005]; vector<pii> dfs(int cur, int par){ vector<pii> v; v.push_back({0, cur}); for(auto nxt: links[cur]){ if(nxt == par) continue; auto nv = dfs(nxt, cur); diam[cur] = max(diam[cur], diam[nxt]); v.push_back({nv[0].first + 1, nxt}); sort(all(v), greater<pii>()); while(v.size() > 2) v.pop_back(); } if(v.size() >= 2) diam[cur] = max(diam[cur], v[0].first + v[1].first); else diam[cur] = max(diam[cur], v[0].first); max_depth[cur] = v; // cout << "cur: " << cur << " diam: " << diam[cur] << " max_depth: "; // for(auto p: v) cout << "(" << p.first << "," << p.second << ") "; // cout << '\n'; return v; } void dfs2(int cur, int par){ for(auto nxt: links[cur]){ if(nxt == par) continue; updepth[nxt] = updepth[cur] + 1; if(max_depth[cur][0].second != nxt) updepth[nxt] = max(updepth[nxt], max_depth[cur][0].first + 1); else if(max_depth[cur].size() >= 2) updepth[nxt] = max(updepth[nxt], max_depth[cur][1].first + 1); dfs2(nxt, cur); } } void solve(){ cin >> N; rep(i, 2, N+1){ int p; cin >> p; links[p].push_back(i); links[i].push_back(p); } dfs(1, -1); dfs2(1, -1); rep(i, 2, N+1) cout << max(diam[1], updepth[i] + diam[i]) << "\n"; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 19581 ๋‘ ๋ฒˆ์งธ ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„

·346 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/19581 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๊ฐ€์ค‘์น˜ ์—†๋Š” ํŠธ๋ฆฌ์ธ์ค„ ์•Œ๊ณ , ๋‹น์—ฐํžˆ ์ง€๋ฆ„-1์ด ๋‹ต์ด ์•„๋‹Œ๊ฐ€? ํ–ˆ๋”๋‹ˆ ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ์—ˆ๋‹ค ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š” ํŠธ๋ฆฌ๋ผ๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ์›๋ž˜ ์“ฐ๋˜ DFS๋‘๋ฒˆ์ด๋ผ๋Š” ๋ฐฉ๋ฒ•์€ ์‰ฝ์ง€ ์•Š์„๊ฒƒ๊ฐ™๋‹ค ๊ฐ€์žฅ ๊ธด ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„๊ณผ, ๋‘๋ฒˆ์งธ๋กœ ๊ธด ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์ด ์•„์˜ˆ ๊ด€๊ณ„ ์—†๋Š” ๊ณณ์— ์žˆ์„ ์ˆ˜๋„ ์žˆ์ง€ ์•Š์„๊นŒ? ์•„๋‹Œ๊ฐ€? ![[Drawing 2026-01-25 09.41.32.excalidraw.png]] ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„๊ณผ ๋‘๋ฒˆ์งธ ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์ด ๋ ์ •์ ์„ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋ ‡๋‹ค๋ฉด, ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์••์ถ•ํ•ด์„œ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ, $a + b = D_1 \geq c + d = D_2$๋ผ ํ•˜์ž. ์ผ๋ฐ˜์„ฑ์„ ์žƒ์ง€ ์•Š๊ณ  $a \geq b, c \geq d$๋ผ ํ•˜์ž. ์„œ๋กœ ๊ณต์œ ํ•˜๋Š” ์ •์  ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ $a + c \geq D_1/2 + D_2/2 \geq D_2$ ์ด๋ฏ€๋กœ, a์™€ c๋ฅผ ์ง€๋‚˜๋Š” ๊ฒฝ๋กœ๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ •ํ•œ ๋‘๋ฒˆ์งธ ์ง€๋ฆ„๋ณด๋‹ค ๋” ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค. ๋” ํฐ ๊ฒฝ์šฐ ๋ชจ์ˆœ์ด๊ณ  ๊ฐ™์€ ๊ฒฝ์šฐ $a+c$๋ฅผ ๋‘๋ฒˆ์งธ ์ง€๋ฆ„์œผ๋กœ ํƒํ•ด๋„ ์•„๋ฌด ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. ์„œ๋กœ ๊ณต์œ ํ•˜๋Š” ์ •์ ์ด ์—†๋Š”๊ฒฝ์šฐ (๋‹ค๋ฅธ ์„œ๋ธŒํŠธ๋ฆฌ์— ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ) $a + c + e + f \geq D_1/2 + D_2/2 + e + f > D_2$ ์ด๋ฏ€๋กœ, $D_2$์˜ ๊ฒฝ๋กœ๋Š” ๋‘๋ฒˆ์งธ ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์ด ์•„๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํŠธ๋ฆฌ์˜ ๋‘๋ฒˆ์งธ ์ง€๋ฆ„์˜ ํ•œ ๋์ ์€ ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์˜ ํ•œ ๋์ ๊ณผ ๊ฐ™๋‹ค. DFS๋ฅผ ๋Œ๋ ค์„œ ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„ ์–‘ ๋ ์ ์„ ์ฐพ๊ณ , ๊ฑฐ๊ธฐ์„œ๋ถ€ํ„ฐ ๋‘๋ฒˆ์งธ์ง€๋ฆ„์„ ํ•œ๋ฒˆ์”ฉ ์ฐพ์•„์ฃผ์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): vector<pii> dfs(int cur, int par){ vector<pii> v; v.push_back({0, cur}); for(auto [nxt, w]: links[cur]){ if(nxt == par) continue; auto nv = dfs(nxt, cur); rep(i, 0, min(2, (int)nv.size())){ v.push_back({nv[i].first + w, nv[i].second}); } sort(all(v), greater<pii>()); while(v.size() > 2) v.pop_back(); } return v; } void solve(){ cin >> N; rep(i, 0, N-1){ int u, v, w; cin >> u >> v >> w; links[u].push_back({v, w}); links[v].push_back({u, w}); } int L = dfs(1, -1)[0].second; // ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์˜ ํ•œ์ชฝ ๋ int ans = 0; auto ret = dfs(L, -1); ans = max(ans, ret[1].first); // ๋‘๋ฒˆ์งธ ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„ ํ›„๋ณด 1 int R = ret[0].second; // ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์˜ ๋‹ค๋ฅธ์ชฝ ๋ ret = dfs(R, -1); ans = max(ans, ret[1].first); // ๋‘๋ฒˆ์งธ ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„ ํ›„๋ณด 2 cout << ans << "\n"; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 5639 ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ

·356 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/5639 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ์ „์œ„ ์ˆœํšŒ ๊ฒฐ๊ณผ๋ฅผ ์ด์šฉํ•ด์„œ ํ›„์œ„ ์ˆœํšŒ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์•„๋‚ด์ž! ํŠธ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋‹ค๋ฉด, ํ›„์œ„ ์ˆœํšŒ๋ฅผ ํ•˜๋Š”๊ฑด ์‰ฌ์šธํ…๋ฐ… ์ „์œ„ ์ˆœํšŒ๋Š” (๋ฃจํŠธ - ์™ผ์ชฝ์„œ๋ธŒํŠธ๋ฆฌ - ์˜ค๋ฅธ์ชฝ์„œ๋ธŒํŠธ๋ฆฌ)๋ฅผ ๋ฐฉ๋ฌธํ•œ๋‹ค. ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๊ฐ’์€ ์–ธ์ œ๋‚˜ ๋ฃจํŠธ๋ณด๋‹ค ์ž‘๊ณ , ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๊ฐ’์€ ์–ธ์ œ๋‚˜ ๋ฃจํŠธ๋ณด๋‹ค ํฌ๋ฏ€๋กœ 50 (๋ฃจํŠธ) --- 30 (์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ) 24 5 28 45 --- 98 (์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ) 52 60 ์ฒซ ์ž…๋ ฅ์— ๋Œ€ํ•ด, ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๊ฐ ์„œ๋ธŒํŠธ๋ฆฌ ๋˜ํ•œ ์ด์ง„ ๊ฒ€์ƒ‰ํŠธ๋ฆฌ์ด๋ฏ€๋กœ, ์ด๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์— ๋Œ€ํ•ด์„œ 30 (๋ฃจํŠธ) --- 24 (์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ) 5 28 --- 45 (์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ) ์œ„์™€ ๊ฐ™์ด ๋ง์ด๋‹ค! ๊ทธ๋ ‡๋‹ค๋ฉด, ์žฌ๊ท€๋ฅผ ์ด์šฉํ•ด์„œ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ํ›„์œ„์ˆœํšŒ๋งŒ ํ•˜๋ฉด ๋๋‚œ๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): vector<int> v; struct Node{ int val = -1; Node* left = nullptr; Node* right = nullptr; Node(int s, int e){ val = v[s]; if(s == e) return; int idx = e+1; rep(i, s+1, e+1){ if(v[i] > val){ idx = i; break; } } if(s+1 <= idx-1) left = new Node(s+1, idx-1); if(idx <= e) right = new Node(idx, e); } }; void postorder(Node* node){ if(node == nullptr) return; postorder(node->left); postorder(node->right); cout << node->val << '\n'; } void solve(){ int x; while(cin >> x) v.push_back(x); Node* root = new Node(0, v.size()-1); postorder(root); } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ