๊ตฌ๋ฆ
์ด๋ผ๋ ๊ณณ์์ ๋ฌธ์ ํ์ด ์ฑ๋ฆฐ์ง(๊ตฌ๋ฆํค ์ฑ๋ฆฐ์ง)๋ฅผ ํ๋ค๊ณ ํด์ ์ฐธ์ฌ ์ค์ด๋ค. ์ด๋ฒคํธ ๊ธฐ๊ฐ ๋์ ๋ฌธ์ ๊ฐ ๊พธ์ค์ด ์ฌ๋ผ์ค๋ฉฐ, ์ฃผ์ 2ํ์ฉ (ํน์ ๊ทธ ์ด์) ์ฑ๋ฆฐ์ง ๋ฌธ์ ๋ค์ ๋ํด ํ์ด๊ฐ ๊ฐ๋ฅํ ๋ฌธ์ ๋ค์ ํ์ดํด๋ณด๊ณ , ํ๊ธฐ๋ฅผ ๋จ๊ฒจ๋ณด๋ ค๊ณ ํ๋ค.
์ด์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋์ ๊ฒฝ์ฐ Union Find
๋ก ์ ๊ทผํ๋ค. ๊ฐ์ ์งํฉ์ ์ํ๋ ๋
์๋ค์ ๊ด๋ฆฌํ ๋๋ ์ด ๋ฐฉ๋ฒ์ด ์ ์ผ ํธํ๋ค.
ํ์ด ๊ณผ์ ์ ์๋์ ๊ฐ๋ค.
merge
ํ๋คroot
๋ฅผ ํ์ธํด์, ์ฒ์ ๋์ค๋ root
๋ฉด Component๋ฅผ ์์ฑํ๋ค.
๊ทธ๋ํ๋ฅผ ๋ค๋ฃจ๋ ๋ฒ๋ง ์ ์๊ณ ์๋ค๋ฉด ์์ ๊ตฌํ ๋ฌธ์ ์ฒ๋ผ ํ์ด๊ฐ ๋๋ค.
์ฃผ์ํด์ผํ ์ ์ ์ ๋ ฌํ ๋ ์ธ๋ฐ, ๋ฐ๋์ ๊ณ์ฐ์ ๋ถ์๋ก ํ๊ฒ ๋๋ฉด WA
๋ฅผ ๋ฐ๊ธฐ ์ฝ๋ค. ์ด ๊ฒฝ์ฐ ๋ถ์๋ก ํ๊ธฐ๋ณด๋ค๋ ์ ๋ฅผ ๋น๊ตํ๋ค ํ ๋ ์ ๋ฅผ ๋น๊ตํ๋ ์์ผ๋ก ํํผํ๋ฉด ์ค์ ์ค์ฐจ ์์ด ์ ๋ ฌํ ์ ์๋ค. ๋, ์ด ๊ฒฝ์ฐ ๋ฌธ์ ์กฐ๊ฑด์์ ์์ ๋ฒ์๊ฐ int
๋ฒ์๋ฅผ ์ด๊ณผํ ์ ์์ผ๋ฏ๋ก, long long
์ ์ฌ์ฉํด์ผ ํ๋ค. (Worst ์ > 0x7FFFFFFF
์ด๋ค)
์๊ฐ ๋ณต์ก๋์ ๋ณ๋ชฉ ๋ถ๋ถ์ ์ ๋ ฌ๊ณผ ์ฒ์ ๊ฐ์ ์ ๋ ฅ์ ๋ฐ๋ ๋ถ๋ถ์ด๊ณ , ์ด๋ค.
#include <bits/stdc++.h>using namespace std;int N, M;typedef long long ll;struct UF {int parent[100001];UF() {for(int i = 0; i <= 100000; ++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;vector<int> adj[100001];struct Component {ll numComputer;ll numConnection;vector<int> members;bool operator<(const Component& t) const {// 1. ์ปค๋ฅ์ ์ / ์ปดํจํฐ ์// 2. ๋ฐ๋ ๊ฐ์ผ๋ฉด ์ปดํจํฐ ์ ์ ์// 3. ๋ ์์ ๋ฒํธ ์ปดํจํฐ ์if (numComputer * t.numConnection != numConnection * t.numComputer) {return numComputer * t.numConnection < numConnection * t.numComputer;}if (numComputer != t.numComputer) {return numComputer < t.numComputer;}return members[0] < t.members[0];}} com[100000];int main() {scanf("%d %d", &N, &M);for(int i = 0; i < M; ++i) {int a, b; scanf("%d %d", &a, &b);adj[a].push_back(b);uf.merge(a, b);}int cid = 0;map<int, int> uq;for(int a = 1; a <= N; ++a) {if (uq.find(uf.getRoot(a)) == uq.end()) {uq[uf.getRoot(a)] = cid;++cid;}int gid = uq[uf.getRoot(a)];com[gid].members.push_back(a);com[gid].numComputer++;}for(int c = 0; c < cid; ++c) {ll cnt = 0;for(auto& cur: com[c].members) {cnt += adj[cur].size();}com[c].numConnection = cnt;}sort(com, com + cid);for(auto& item: com[0].members) {printf("%d ", item);}printf("\n");return 0;}