๋ฌธ์
ํ์ด
1๏ธโฃ ํธ๋ฆฌ์ ํน์ง๊ณผ bfs ๋ฅผ ์ด์ฉํ ํ์ด
๐ก ๋ ์ค๋ฅธ Idea
์ด ๋ฌธ์ ๋, ๋ฌด์์๋ก ์ฃผ์ด์ง๋ ๋ ธ๋๊ฐ์ ๊ด๊ณ๋ฅผ ํธ๋ฆฌ๊ด๊ณ๋ก ํ์ด๊ฐ์ผ ํ๋ ๋ฌธ์ ์ด๋ค.
๋จผ์ , ์๊ฐํ ์ ์๋ ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
1. ์ ์์ ์ธ ํธ๋ฆฌ ํํ๋ฅผ ์ด๋ฃจ๊ณ ์๋ ์งํฉ์ธ ๊ฒฝ์ฐ
2. ํน์ ๋ ธ๋ ์งํฉ์ด ์ฌ์ดํด์ ์ด๋ฃจ๊ณ ์๋ ๊ฒฝ์ฐ
3. 1๋ฒ ํน์ 2๋ฒ ๊ฐ์ ์งํฉ์ด ์ฐ๊ฒฐ๋์ด์์ง ์๊ณ ๋จ์ด์ ธ ์๋๊ฒฝ์ฐ
๊ทธ๋์ ๋ชจ๋ ๋ด๋ฐ์ ํ๋์ ํธ๋ฆฌ ํํ๋ก ์ฐ๊ฒฐํ๊ธฐ ์ํ ํ์๋ฅผ ์ด๋ป๊ฒ ๊ตฌํด์ผํ ๊น ๊ณ ๋ฏผํ๋๋ฐ
๋จผ์ 1๋ฒ ๊ฐ์ ์งํฉ์ ๊ฒฝ์ฐ ๊ฑด๋๋ฆด ๊ฒ์ด ์๋ค.
ํ์ง๋ง 1๋ฒ๊ฐ์ ์งํฉ์ด n๊ฐ๊ฐ ์๊ณ ์งํฉ๊ฐ์ ์ฐ๊ฒฐ์ด ๋์ด์์ง ์์ผ๋ฉด ์๋ก ์ฐ๊ฒฐ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ n-1๋ฒ์ ์ฐ์ฐ์ด ํ์ํ๋ค.
๋ฐ๋ผ์, bfs๋ฅผ ํตํด์ ์๋ก ์ฐ๊ฒฐ๋์ด ์์ง ์์ ์งํฉ์ ๊ฐ์๋ฅผ ์ธ์ด์ค ํ, ๊ทธ ์งํฉ ๊ฐ์ -1 ๋ฒ์ ์ฐ์ฐ์ด ํ์ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
2๋ฒ ์ผ์ด์ค์ ๊ฒฝ์ฐ ์ฌ์ดํด์ ์ด๋ฃจ๊ณ ์๋ค๋ฉด, ์ฌ์ดํด์ ์ ๊ฑฐํด์ฃผ์ด์ผ ํ๋๋ฐ
ํธ๋ฆฌ์ ๋ํ์ ์ธ ํน์ง ์ค ํ๋์ธ, ํธ๋ฆฌ ๊ฐ์ ์ ๊ฐ์๋ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ (๋ ธ๋์ ๊ฐ์ -1) ๊ฐ ๋ผ๋ ํน์ง์ ์ด์ฉํ์ฌ
ํน์ ์งํฉ์ ์ด ๊ฐ์ ์ ๊ฐ์๋ฅผ ๊ตฌํ ํ, (๋ ธ๋์ ๊ฐ์ -1)๊ฐ๋ก ๋ง๋ค์ด์ฃผ๊ธฐ ์ํด ์ ๊ฑฐํด์ผํ๋ ๊ฐ์ ์ ์๋ฅผ ๊ตฌํจ์ผ๋ก์ ์ฌ์ดํด์ ์ ๊ฑฐํ๊ธฐ ์ํ ํ์๋ฅผ ๊ตฌํ ์ ์์๋ค.
๋ฐ๋ผ์, ๊ฐ ์งํฉ์ด ๋ช๊ฐ์ธ์ง ๊ตฌํ๊ณ ๊ฐ ์งํฉ์ด ์ด๋ฃจ๋ ๊ฐ์ ์ ๊ฐ์๋ฅผ ๊ตฌํ ์ ์๋ค๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
public class Main {
static List<List<Integer>> nodes;
static boolean[] checked;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
int N = Integer.parseInt(input[0]);
int M = Integer.parseInt(input[1]);
nodes = new ArrayList<>();
for (int i = 0; i < N + 1; i++) {
nodes.add(new ArrayList<>());
}
// ๊ฐ์ ์๋ฐฉํฅ ์ฐ๊ฒฐ
for (int i = 0; i < M; i++) {
input = br.readLine().split(" ");
int u = Integer.parseInt(input[0]);
int v = Integer.parseInt(input[1]);
nodes.get(u).add(v);
nodes.get(v).add(u);
}
checked = new boolean[N + 1];
int ans = 0;
int cntOfGroup = 0;
for (int i = 1; i < N + 1; i++) {
if (!checked[i]) {
int[] result = bfs(i);
ans += (result[1] - (result[0] - 1));
cntOfGroup++;
}
}
ans += cntOfGroup - 1;
System.out.println(ans);
}
private static int[] bfs(int start) {
Queue<Integer> q = new LinkedList<>();
q.offer(start);
checked[start] = true;
int cntOfEdge = 0;
int cntOfNode = 0;
while (!q.isEmpty()) {
int poll = q.poll();
cntOfNode++;
for (int connect : nodes.get(poll)) {
if (!checked[connect]) {
checked[connect] = true;
q.offer(connect);
}
}
cntOfEdge += nodes.get(poll).size();
}
// ๊ฐ์ ์ ์๋ฐฉํฅ์ด๋ผ ๊ฐ์ ํ๊ณ ๊ฐ์๋ฅผ ๊ตฌํ๊ณ ๋๋๊ธฐ 2๋ฅผ ํ๋ฉด ๊ฐ์ ์ ๊ฐ์๊ฐ ๋๋ค.
return new int[]{cntOfNode, cntOfEdge/2};
}
}
๊ฒฐ๊ณผ