๊ตฌ๋ฆ
์ด๋ผ๋ ๊ณณ์์ ๋ฌธ์ ํ์ด ์ฑ๋ฆฐ์ง(๊ตฌ๋ฆํค ์ฑ๋ฆฐ์ง)๋ฅผ ํ๋ค๊ณ ํด์ ์ฐธ์ฌ ์ค์ด๋ค. ์ด๋ฒคํธ ๊ธฐ๊ฐ ๋์ ๋ฌธ์ ๊ฐ ๊พธ์ค์ด ์ฌ๋ผ์ค๋ฉฐ, ์ฃผ์ 2ํ์ฉ (ํน์ ๊ทธ ์ด์) ์ฑ๋ฆฐ์ง ๋ฌธ์ ๋ค์ ๋ํด ํ์ด๊ฐ ๊ฐ๋ฅํ ๋ฌธ์ ๋ค์ ํ์ดํด๋ณด๊ณ , ํ๊ธฐ๋ฅผ ๋จ๊ฒจ๋ณด๋ ค๊ณ ํ๋ค.
์ด์ ๋ง์ง๋ง ์ฃผ์ฐจ์ธ 4์ฃผ์ฐจ๋ค. 4์ฃผ์ฐจ์ ์ฒซ ๋ฌธ์ ๋ ๊ทธ๋ํ๊ฐ ์ถ์ ๋์๋ค.
์ด ๋ฌธ์ ๋ ๋์ ๊ฒฝ์ฐ Union Find
๋ก ์ ๊ทผํ๋ค. ๊ฐ์ ์งํฉ์ ์ํ๋ ๋
์๋ค์ ๊ด๋ฆฌํ ๋๋ ์ด๊ฒ๋งํผ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ์๊ธฐ์..
ํน์ดํ ๋งํ ์กฐ๊ฑด์ ์๋ฐฉํฅ์ผ๋ก ์ฐ๊ฒฐ๋ ๋์๋ง ์ฐํฉ
์ผ๋ก ์ธ์ ํ๋ค๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ์ผ๋จ ์
๋ ฅ์ ์ญ ๋ฐ์ ์ดํ, ๋ค์ํ๋ฒ ๋ฃจํ๋ฅผ ๋๋ฉด์ ์ฐํฉ์ ์ด๋ฃจ๋ ๋
์๋ค์ merge
ํด์ค๋ค. ์ด ํ, set
์ ํ์ฉํด์, ๋ฃจํธ ์ ์ ์ ์ง์ด๋ฃ์ด์ค ๋ค unique
ํ ๋
์๋ค์ ์๋ฅผ ์ธ์ด์ฃผ๋ฉด ์ฝ๊ฒ ํ ์ ์๋ค.
๋ด ํ์ด์ ์๊ฐ ๋ณต์ก๋๋ ์ ์ ๊ฐ์ ์ฐ๊ฒฐ์ ์ฒดํฌํ๋ ๋ถ๋ถ ๋๋ฌธ์ ๊ฐ ๋๋ค. ๋ง์ฝ ์ด ์ฐ๊ฒฐ์ ์ฒดํฌํ๋ ๋ถ๋ถ์ ์ธ์ ๋ฐฐ์ด๋ก ๊ด๋ฆฌํ๋ค๋ฉด, ์๊ฐ๋ณต์ก๋๋ฅผ ์ผ๋ก ์ค์ผ ์ ์๊ฒ ๋ค.
#include <bits/stdc++.h>using namespace std;bool conn[2001][2001];int N, M;struct UF {int parent[2001];UF() {for(int i = 0; i <= 2000; ++i) parent[i] = i;}int getRoot(int v) {if (v == parent[v]) return v;return parent[v] = getRoot(parent[v]);}void merge(int a, int b) {a = getRoot(a);b = getRoot(b);if (a == b) return;parent[b] = a;}} uf;int main() {scanf("%d %d", &N, &M);for(int i = 0; i < M; ++i) {int a, b; scanf("%d %d", &a, &b);conn[a][b] = true;}for(int a = 1; a <= N; ++a) {for(int b = a + 1; b <= N; ++b) {if (conn[a][b] == true && conn[b][a] == true) {uf.merge(a, b);}}}set<int> uq;for(int a = 1; a <= N; ++a) {uq.insert(uf.getRoot(a));}printf("%d\n", (int)uq.size());return 0;}