Skip to main content

UnionFind

BOJ 24452 ไบคๆ˜“่จˆ็”ป (Trade Plan)

·593 words·3 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/24452 ๋ฒˆ์—ญ ๋ฌธ์ œ ๋ฒˆ์—ญ # JOI ์—ฐ๋ฐฉ๊ตญ์—๋Š” 1๋ถ€ํ„ฐ N๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ง„ N๊ฐœ์˜ ๋„์‹œ์™€, 1๋ถ€ํ„ฐ M๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ง„ M๊ฐœ์˜ ๋„๋กœ๊ฐ€ ์žˆ๋‹ค. ๋„๋กœ i (1 โ‰ฆ i โ‰ฆ M)๋Š” ๋„์‹œ Ui์™€ ๋„์‹œ Vi๋ฅผ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ณ  ์žˆ๋‹ค. JOI ์—ฐ๋ฐฉ๊ตญ์€ 1๋ถ€ํ„ฐ K๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ง„ K๊ฐœ์˜ ์ฃผ(ๅทž)๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๋„์‹œ j (1 โ‰ฆ j โ‰ฆ N)๋Š” ์ฃผ Sj์— ์†ํ•ด ์žˆ๋‹ค. ๋˜ํ•œ, ๋ชจ๋“  ์ฃผ๋Š” ์ ์–ด๋„ ํ•˜๋‚˜์˜ ๋„์‹œ๋ฅผ ํฌํ•จํ•œ๋‹ค.

BOJ 31055 A Graph Problem

·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$์— ๋Œ€ํ•ด ๋‹ค์Œ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

BOJ 3830 ๊ต์ˆ˜๋‹˜์€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š”๋‹ค

·176 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/3830 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋‘ ๊ฐ’์˜ ์ฐจ์ด๋ฅผ ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ์ €์žฅํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ž. ๊ฐ„์„ ์— ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š” ํŠธ๋ฆฌ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ๋‘ ๊ฐ’ $a, b$๊ฐ€ ๊ฐ™์€ ํŠธ๋ฆฌ์— ์žˆ๋‹ค๋ฉด ๋น„๊ต ๊ฐ€๋Šฅํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋น„๊ต ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ ํŠธ๋ฆฌ๊ฐ€ ์ง์„ ํ˜•์ด ๋˜๋ฉด, ์ตœ์•…์˜ ๊ฒฝ์šฐ $O(N)$์ด ๊ฑธ๋ฆฐ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์— UnionFind์—์„œ ๊ฒฝ๋กœ ์••์ถ•์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ๋‹ค. ๊ฒฐ๊ตญ ๋ฃจํŠธ๊นŒ์ง€์˜ ๊ฐ„์„  ๊ฐ€์ค‘์น˜ ํ•ฉ์„ ์ €์žฅํ•ด์„œ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ while(1){ int N, M; cin >> N >> M; if(N + M == 0) break; UnionFind uf(N); while(M--){ char op; cin >> op; if(op == '!'){ int a, b, w; cin >> a >> b >> w; uf.merge(a-1, b-1, w); } else{ int a, b; cin >> a >> b; auto [ra, wa] = uf.find(a-1); auto [rb, wb] = uf.find(b-1); if(ra != rb) cout << "UNKNOWN\n"; else cout << wb - wa << '\n'; } } } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 21932 To be Connected, or not to be, that is the Question

·512 words·3 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/21932 ๋ฒˆ์—ญ ๋ฌธ์ œ ๋ฒˆ์—ญ # ๋ฌธ์ œ ์„ค๋ช… # ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์ง€๊ณ , ๊ฐ ๋…ธ๋“œ์—๋Š” ์–‘์˜ ์ •์ˆ˜ ๊ฐ’์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž„๊ณ„๊ฐ’(threshold)์ด ์ฃผ์–ด์ง€๋ฉด, ๊ทธ๋ž˜ํ”„์˜ ๋…ธ๋“œ๋“ค์€ ๋‘ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค: ํ•˜๋‚˜๋Š” ์ž„๊ณ„๊ฐ’ ์ดํ•˜์˜ ๊ฐ’์„ ๊ฐ€์ง„ ๋…ธ๋“œ๋“ค๋กœ ๊ตฌ์„ฑ๋˜๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋‚˜๋จธ์ง€ ๋…ธ๋“œ๋“ค๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ์„œ๋กœ ๋‹ค๋ฅธ ๊ทธ๋ฃน์— ์†ํ•œ ๋‘ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ชจ๋“  ๊ฐ„์„ ์„ ์ œ๊ฑฐํ•˜์—ฌ ์–ป์€ ์›๋ž˜ ๊ทธ๋ž˜ํ”„์˜ ๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋…ธ๋“œ ๊ทธ๋ฃน์ด ๋ชจ๋‘ ๋น„์–ด์žˆ์ง€ ์•Š์„ ๋•Œ, ์ฃผ์–ด์ง„ ๊ทธ๋ž˜ํ”„๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ๊ฒฐ๊ณผ ๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„๋Š” ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง‘๋‹ˆ๋‹ค.

BOJ 18180 Saba1000kg

·584 words·3 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/18180 ๋ฒˆ์—ญ ๋ฌธ์ œ ๋ฒˆ์—ญ # ๋ฐ”์ดํ‚น ๋ฝ ์šด๋™์—๋Š” ๋‹ค์–‘ํ•œ ํ๋ฆ„์ด ์กด์žฌํ•œ๋‹ค. ์˜ฌ๋“œ ์•„์ด์Šฌ๋ž€๋“œ ๊ทธ๋ž˜๋‹ˆํŠธ ๋ฝ, ๋ฏธ๋“ค ๋ฐ๋‹ˆ์‰ฌ ๋”์Šคํ‹ฐ ๋ฐ”์ดํ‚น ๋ฝ, ๋ ˆ์ดํŠธ ํ•€๊ฒŒ์ผ ๋‹คํฌ ๊ทธ๋ฆฐ ๋ฝ, ํ”ผ์˜ค๋ฅด๋“œ ๋ณผ๋” ์•„๋ฐœ๋ž€์ฒด ๋ฝ ๋“ฑ, ์ธ๊ธฐ ์žˆ๋Š” ํ๋ฆ„์˜ ์ „์ฒด ๋ชฉ๋ก์„ ๋‚˜์—ดํ•˜๋ฉด ์ด ํŽ˜์ด์ง€๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฐ€๋“ ์ฑ„์šธ ์ •๋„์ด๋‹ค. ์Šค์นธ๋””๋‚˜๋น„์•„ ๊ณ ๋“ฑ๊ต์œก๋ถ€๋Š” ์ด๋Ÿฌํ•œ ํ๋ฆ„๋“ค์ด ์„œ๋กœ ์–ด๋–ป๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ๋Š”์ง€ ์—ฐ๊ตฌํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋“ค์€ ํ˜„์žฌ ๋Œ€๊ทœ๋ชจ ์‹คํ—˜์„ ๊ณ„ํš ์ค‘์ด๋ฉฐ, ์ ์ ˆํžˆ ์„ ๋ฐœ๋œ ์ž์›๋ด‰์‚ฌ์ž๋“ค์„ ๋ฌด์ธ๋„๋“ค๋กœ ๊ตฌ์„ฑ๋œ ๊ตฐ๋„์— ๋ฐฐ์น˜ํ•˜์—ฌ ์ƒ๋Œ€์ ์œผ๋กœ ๊ธด ์‹œ๊ฐ„ ๋™์•ˆ ๊ทธ๋“ค์˜ ์Œ์•…์  ์Šคํƒ€์ผ๊ณผ ์„ ํ˜ธ๋„๊ฐ€ ์„œ๋กœ ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๊ด€์ฐฐํ•˜๊ณ ์ž ํ•œ๋‹ค.

BOJ 25567 ์ค„ ์„ธ์šฐ๊ธฐ

·332 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/25567 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๊ตฌ๊ฐ„ํ•ฉ?์„ ํ•˜๋ ค๋ฉด ๊ฒฐ๊ตญ ์™„์„ฑ๋œ ๋ฐฐ์—ด์ด ์žˆ์œผ๋ฉด ์ข‹์„๊ฑฐ๊ฐ™์€๋ฐ.. ๊ทผ๋ฐ ์ค„์ด ๋‹ค๋ฅผ๋•Œ๋งŒ ํ•ฉ์น˜๋‹ˆ๊นŒ, ๊ฒฐ๊ตญ ์™„์„ฑ๋œ ์ค„์€ ๊ณ ์ •์ ์œผ๋กœ ์กด์žฌํ•œ๋‹ค! ์˜คํ”„๋ผ์ธ์œผ๋กœ ์ž˜ ๋Œ๋ฉด์„œ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋˜๋Š”๊ฑฐ๊ฐ™๋‹ค. ์ค„์˜ ๋งจ์•ž๊ณผ ๋งจ๋’ค๊ฐ€ ์–ด๋”˜์ง€ ์ž˜ ๊ด€๋ฆฌํ•˜๊ณ , ๋ชจ๋“  ์ค„์ด ํ•ฉ์ณ์ง€์ง€๋Š” ์•Š์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ด๋ฅผ ์ฃผ์˜ํ•˜์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N; cin >> N; int sz = 0; vector<vector<int>> lines; rep(i, 0, N){ int cnt; cin >> cnt; vector<int> line(cnt); rep(j, 0, cnt) cin >> line[j]; lines.push_back(line); sz += cnt; } vector<array<int, 3>> Queries; // {query, a, b} int Q; cin >> Q; rep(i, 0, Q){ int op, a, b; cin >> op >> a >> b; Queries.push_back({op, a, b}); } // lineId[x] = i : x๋ฒˆ ์‚ฌ๋žŒ์ด i๋ฒˆ์งธ ์ค„์— ์†ํ•จ vector<int> lineId(sz+1); rep(i, 0, N) for(auto x: lines[i]) lineId[x] = i; UnionFind UF(N), UFrev(N); vector<int> nxt(N, -1); for(auto [op, a, b]: Queries){ if(op == 2) continue; int lineA = lineId[a]; int lineB = lineId[b]; if(UF.find(lineA) != UF.find(lineB)){ // lineA ๋’ค์— lineB ๋ถ™์ด๊ธฐ int tailA = UFrev.find(lineA); int headB = UF.find(lineB); nxt[tailA] = headB; UF.merge(lineA, lineB); UFrev.merge(lineB, lineA); } } vector<int> mergedLineId(sz+1); vector<int> mergedLineIdx(sz+1); vector<vector<ll>> pfsum(N); rep(i, 0, N) if(UF.find(i) == i){ vector<int> order; int cur = i; while(cur != -1){ for(auto x: lines[cur]) order.push_back(x); cur = nxt[cur]; } for(int j = 0; j < (int)order.size(); j++){ mergedLineId[order[j]] = i; mergedLineIdx[order[j]] = j; } pfsum[i].resize(order.size()+1); rep(j, 0, order.size()) pfsum[i][j+1] = pfsum[i][j] + order[j]; } // ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ UnionFind UF2(N); for(auto [op, a, b]: Queries){ int lineA = lineId[a]; int lineB = lineId[b]; if(op == 1){ if(UF2.merge(lineA, lineB)) cout << "YES\n"; else cout << "NO\n"; } else{ if(UF2.find(lineA) != UF2.find(lineB)){ cout << "-1\n"; continue; } int mergedLine = mergedLineId[a]; int idxA = mergedLineIdx[a]; int idxB = mergedLineIdx[b]; if(idxA > idxB) swap(idxA, idxB); cout << pfsum[mergedLine][idxB+1] - pfsum[mergedLine][idxA] << "\n"; } } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 1647 ๋„์‹œ ๋ถ„ํ•  ๊ณ„ํš

·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"; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 10775 ๊ณตํ•ญ

·145 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/10775 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # 1๋ฒˆ ๊ฒŒ์ดํŠธ๊ฐ€ ์ œ์ผ ์“ฐ๊ธฐ ์ข‹์•„๋ณด์ธ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ 1๋ฒˆ ๊ฒŒ์ดํŠธ๋ฅผ ์•„๋‚€๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด, ๋ชจ๋“  ๋น„ํ–‰๊ธฐ๋ฅผ ๋„ํ‚น์‹œํ‚ฌ๋•Œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ“๊ฐ’์œผ๋กœ ๋„ํ‚น์‹œํ‚ค๋ฉด ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋ฅผ ๋‚˜์ด๋ธŒํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ํ•œ๋ฒˆ๋‹น $O(G)$๊ฐ€ ๊ฑธ๋ฆด ๊ฒƒ์ด๋‹ค. 100000 100000 100000 100000 100000 ... ๊ณผ ๊ฐ™์€ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ $\text{calc}(g_i) = g_i$ ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์‚ด์•„์žˆ๋Š” ๊ฒŒ์ดํŠธ์˜ ์ตœ๋Œ“๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์œผ๋ฉด ๋œ๋‹ค. ์ด๋Š” ์œ ๋‹ˆ์˜จํŒŒ์ธ๋“œ๋กœ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค! mergeํ• ๋•Œ ์ž์‹ ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int G, P; cin >> G >> P; UF.init(G+1); int ans = 0; while(P--){ int g; cin >> g; int rt = UF.find(g); if(rt == 0) break; UF.merge(rt, rt-1); ans++; } cout << ans << "\n"; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 1043 ๊ฑฐ์ง“๋ง

·161 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/1043 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์ง€๋ฏผ์ด๋Š” ๋ชจ๋“  ํŒŒํ‹ฐ์— ์ฐธ์—ฌํ•ด์•ผํ•˜๋ฏ€๋กœ, ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋Š” ํŒŒํ‹ฐ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ์€ ์ง„์‹ค์„ ์•Œ๊ฒŒ ๋œ๋‹ค. ๋ชจ๋“  ํŒŒํ‹ฐ์— ๋Œ€ํ•ด ์ง„์‹ค์„ ์•Œ๊ฒŒ ๋œ ์‚ฌ๋žŒ์„ ํ™•์ธํ•œ ํ›„, ์ง„์‹ค์„ ์•„๋Š”์‚ฌ๋žŒ์ด ์—†๋Š” ํŒŒํ‹ฐ๋“ค์˜ ์ˆ˜๋ฅผ ์„ธ๋ฉด ๋œ๋‹ค. ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ, ๋ถ„๋ฆฌ ์ง‘ํ•ฉ์œผ๋กœ ํ•ด๊ฒฐํ•˜์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N, M; cin >> N >> M; vector<vector<int>> parties; UnionFind UF(N+1); // 0์€ ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ int cnt; cin >> cnt; rep(i, 0, cnt){ int a; cin >> a; UF.merge(0, a); } rep(i, 0, M){ cin >> cnt; vector<int> party(cnt); rep(j, 0, cnt) cin >> party[j]; parties.push_back(party); rep(j, 0, cnt-1) UF.merge(party[j], party[j+1]); } int ans = 0; for(auto party: parties){ bool flag = true; for(auto p: party) if(UF.find(p) == 0) flag = false; if(flag) ans++; } cout << ans; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ