먼저 연결요소(Connected Component)
가 무엇인지 몰라서 찾아보았다.
하나의 그래프가 서로 연결되지 않은 작은 그래프들로 이루어져있을 때 작은 그래프들을 연결 요소라고한다.
예를들어 위의 예제1에서의 그래프는 다음과 같은데, 여기서 연결요소의 개수는 2개이다.
정점과 간선이 주어졌을 때 연결요소의 개수를 구하는 방법은 dfs,bfs이 있는데 나는 익숙한 bfs를 사용하였다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
public class No11724_연결요소의개수 {
static int[][] graph;
static boolean[] visited;
static int N;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String temp[] = br.readLine().split(" ");
N = Integer.parseInt(temp[0]); //정점의 개수
int M = Integer.parseInt(temp[1]); //간선의 개수
int conn =0; //연결요소의 개수
graph= new int[N+1][N+1];
visited = new boolean[N+1];
for (int i=0;i<M;i++) {
String s[] = br.readLine().split(" ");
graph[Integer.parseInt(s[0])][Integer.parseInt(s[1])] =1;
graph[Integer.parseInt(s[1])][Integer.parseInt(s[0])] =1;
}
for (int i=1;i<=N;i++) {
if (!visited[i]) {
bfs(i);
conn++;
}
}
System.out.println(conn);
}
public static void bfs (int n) {
Queue<Integer> queue = new LinkedList<>();
queue.add(n);
visited[n] = true;
while (!queue.isEmpty()) {
int current = queue.poll();
for (int i = 1; i <= N; i++) {
if (visited[i] == false && graph[current][i] == 1) {
visited[i] = true;
queue.add(i);
}
}
}
}
}
여태까지 풀던 bfs문제들은 이차원배열이 주어진 형태였는데, 이렇게 그래프 형태로 정점과 간선이 주어졌을 때 어떻게 탐색할지 떠올리는게 어려웠다.
==> 우선 인접행렬에 그래프 정보를 저장하고, 반복문을 통해 정점을 순회!