·57 words·1 min
π λ¬Έμ μ 보 # λ§ν¬: https://www.acmicpc.net/problem/31055 λ²μ λ¬Έμ λ²μ # Bessieλ μν μ§μμ ν₯μμν€κΈ° μν΄ κ·Έλν μ΄λ‘ κ°μ’λ₯Ό μκ°νκ³ μλλ°, λ€μ λ¬Έμ μμ λ§νμ΅λλ€. κ·Έλ
λ₯Ό λμμ£ΌμΈμ!
μ°κ²°λ 무방ν₯ κ·Έλνκ° μ£Όμ΄μ§λλ€. μ μ μ $1\dots N$μΌλ‘, κ°μ μ $1\dots M$μΌλ‘ λΌλ²¨λ§λμ΄ μμ΅λλ€ ($2\le N\le 2\cdot 10^5$, $N-1\le M\le 4\cdot 10^5$).
κ·Έλνμ κ° μ μ $v$μ λν΄ λ€μ κ³Όμ μ μνν©λλ€:
·327 words·2 mins
π λ¬Έμ μ 보 # λ§ν¬: https://www.acmicpc.net/problem/4792 π§ κ΄μ°° λ° μ κ·Ό # νλμ κ°μ μ $k$κ°, λΉ¨κ°μ κ°μ μ $(N-1) - k$κ° μ΄μ©ν΄μ MSTλ₯Ό μ§μΌνλλ°.. μΌλ¨ νλμ κ°μ $k$κ°λ₯Ό κ²°μ νλ©΄ λΉ¨κ°μμ κ·Έλ₯ μ νλ₯Ό λ€ν΄λ²λ¦¬λ©΄ λλκΉ, νλμ κ°μ μ μ κ³ λ₯΄λκ² μ€μνλ€. λμ΄λΈνκ² νλ€λ©΄ $\binom{\binom{N}{2}}{k}$μΈκ°? κ°μ κ°μλ κ·Έλ λ€ μ³λ, $k$κ°λ₯Ό κ³ λ₯΄λκ² λ무 ν°λ… μμ λ¬Έμ λΆν° μ°¨κ·Όν νμ΄λ³΄μ. $k = 0$ μ΄λΌλ©΄ λͺ¨λ κ°μ λ€λ‘ μ€ν¨λνΈλ¦¬κ° λ§λ€μ΄μ§λμ§ νμΈνλ λ¬Έμ λ‘ λ°λλ€. $k = 1$ ![[Drawing 2026-01-30 19.56.46.excalidraw.png]] μμ κ°μ κ·Έλνκ° μμλ€κ³ μκ°νμ. νλ κ°μ 1κ°λ₯Ό $1 - 2$ κ°μκ±Έ 골λΌλ²λ¦¬λ©΄ λΆκ°λ₯ν΄μ§λ λ¬Έμ κ° μκΈ΄λ€. μ 골λΌμΌ νλ€. μ.. λΉ¨κ°μμΌλ‘ 미리 λ€ ν©μ³λκ³ , λλ¨Έμ§λ₯Ό μ°κ²°ν κ°μ μ΄μμ νλκ°μ μ νμνκ±° κ°μλ°.. κ·Έλ°λ°, μ΄λ―Έ MSTκ° μ μλ€λ©΄, λΉ¨κ° κ°μ μ νλ κ°μ μΌλ‘ λ체νλκ² κ½€ μμ λ‘μ΄κ°? μ΄κ²λ§ λλ©΄ ν° λ¬Έμ κ° μλλ°? $k > 1$ ![[Drawing 2026-01-30 20.04.04.excalidraw.png]] μ£Όν©μμ΄ μ΄λ―Έ λ§λ€μ΄μ§ MST, λλ¨Έμ§λ₯Ό λ¨μ κ°μ μ΄λΌκ³ νμ. μ΄λ€ νλμ κ°μ μ νλ μ°κ³ μΆμΌλ©΄, λ μ μ μΌλ‘ κ°λ κ²½λ‘μ μλ λΉ¨κ°μμ λμ΄λ²λ¦¬κ³ νλμμΌλ‘ μλ‘ μ°κ²°νλ©΄ λλ€! μ΄κ² μλλ κ²½μ°λ μ΄λ―Έ κ·Έ λ μ μ μΌλ‘ κ°λ κ²½λ‘κ° λ€ νλμ κ°μ λ§μΌλ‘ μ°κ²°λ κ²½μ°μΈλ°.. μν, λΆλ¦¬μ§ν©μ νλ λ κ΄λ¦¬νλκ±Έλ‘ μ½κ² ν μ μλ κ² κ°λ€. π» νμ΄ # μ½λ (C++): void solve(){ while(1){ int N, M, K; cin >> N >> M >> K; if(N + M + K == 0) break; vector<pii> Redges, Bedges; rep(i, 0, M){ char color; cin >> color; int u, v; cin >> u >> v; u--; v--; if(color == 'R') Redges.push_back({u, v}); else Bedges.push_back({u, v}); } UnionFind UF(N), BUF(N); // μΌλ¨ νλμ κ°μ μ μ΅μλ‘ μΈλ λλμ§ νμΈ int cnt = 0; for(auto [u, v]: Redges) UF.merge(u, v); for(auto [u, v]: Bedges) if(UF.merge(u, v)){ cnt++; BUF.merge(u, v); } if(cnt > K){ cout << 0 << '\n'; continue; } // λΉ¨κ° κ°μ μ νλνλ νλμμΌλ‘ λ°κΎΈκΈ° for(auto [u, v]: Bedges) if(BUF.merge(u, v)) cnt++; if(cnt < K){ cout << 0 << '\n'; continue; } cout << 1 << '\n'; } } π ꡬν μ½λ μ κΈ
·196 words·1 min
π λ¬Έμ μ 보 # λ§ν¬: https://www.acmicpc.net/problem/2887 π§ κ΄μ°° λ° μ κ·Ό # λκ°λ΄λ MSTλ₯Ό μ§μΌνλκ±°κ°μλ°.. νμ± λκ°μ λν΄ λͺ¨λ μκ°νλ©΄ κ°μ μ κ°μκ° $N^2$κ°κ° λλ€… κ·Έλ°λ°, μκ°ν΄λ³΄λ©΄ λ§μ½ νμ± $A, B, C$κ° μκ³ , μΈκ° λͺ¨λ $x$λ₯Ό κΈ°μ€μΌλ‘ μ°κ²°νλ€κ³ νμ. $x_A < x_B < x_C$λΌλ©΄, $x_A$μ $x_C$μ κ΄κ³λ₯Ό μ κ²½ μΈ νμκ° μμκΉ? μλ€!! λ°λΌμ, $x, y, z$ κ°κ°μ λν΄ μ λ ¬ν κ°μ $3N$κ°μ λλ₯Ό μ΄μ©ν΄μ MSTλ₯Ό μ§μ. π» νμ΄ # μ½λ (C++): void solve(){ int N; cin >> N; vector<array<ll, 4>> planets; rep(i, 0, N){ int x, y, z; cin >> x >> y >> z; planets.push_back({x, y, z, i}); } vector<array<ll, 3>> edges; sort(all(planets), [](auto &a, auto &b){ return a[0] < b[0]; }); rep(i, 0, N-1) edges.push_back({abs(planets[i][0]-planets[i+1][0]), planets[i][3], planets[i+1][3]}); sort(all(planets), [](auto &a, auto &b){ return a[1] < b[1]; }); rep(i, 0, N-1) edges.push_back({abs(planets[i][1]-planets[i+1][1]), planets[i][3], planets[i+1][3]}); sort(all(planets), [](auto &a, auto &b){ return a[2] < b[2]; }); rep(i, 0, N-1) edges.push_back({abs(planets[i][2]-planets[i+1][2]), planets[i][3], planets[i+1][3]}); sort(all(edges)); UF.init(N); ll ans = 0; for(auto [w, u, v]: edges) if(UF.merge(u, v)) ans += w; cout << ans << '\n'; } π ꡬν μ½λ μ κΈ
·152 words·1 min
π λ¬Έμ μ 보 # λ§ν¬: https://www.acmicpc.net/problem/1647 π§ κ΄μ°° λ° μ κ·Ό # μ§ (μ μ )κ³Ό κΈΈ (κ°μ )μ΄ μλ€. λ§μ λκ°λ‘ λΆλ¦¬ν΄μΌνλ€. μ΄ λ, κ°μ μ κ°μ€μΉμ ν©μ μ΅μνν΄μΌνλ€. μ΄λ―Έ λ μ§μ΄ ν λ§μ μμ μλ€λ©΄, λμ΄ μ°κ²°ν νμκ° μλ€. μ΄λ―Έ λ€λ₯Έ μ°νλ‘λ‘ κ° μ μκΈ° λλ¬Έ μ°κ²°νλ λμ€ λ§μμ΄ λκ°κ° λ¨μλ€λ©΄ λλ΄λ©΄ λλ€. ν¬λ£¨μ€μΉΌ μκ³ λ¦¬μ¦μΌλ‘ λ©μ΄λ¦¬κ° λκ°κ° λ¨μλκΉμ§ λ°λ³΅νλ©΄ λκ² λ€. π» νμ΄ # μ½λ (C++): void solve(){ int N, M; cin >> N >> M; vector<tuple<int, int, int>> edges; // weight, u, v rep(i, 0, M){ int u, v, w; cin >> u >> v >> w; edges.emplace_back(w, u, v); } UF.init(N+1); sort(all(edges)); int ans = 0; for(auto &[w, u, v]: edges){ if(UF.group == 3) break; if(UF.merge(u, v)) ans += w; } cout << ans << "\n"; } π ꡬν μ½λ μ κΈ