[백준] No11724-연결요소의 개수(JAVA)

GyeongEun Kim·2021년 10월 13일
0
post-custom-banner


연결요소란?

먼저 연결요소(Connected Component)가 무엇인지 몰라서 찾아보았다.
하나의 그래프가 서로 연결되지 않은 작은 그래프들로 이루어져있을 때 작은 그래프들을 연결 요소라고한다.

예를들어 위의 예제1에서의 그래프는 다음과 같은데, 여기서 연결요소의 개수는 2개이다.

정점과 간선이 주어졌을 때 연결요소의 개수를 구하는 방법은 dfs,bfs이 있는데 나는 익숙한 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문제들은 이차원배열이 주어진 형태였는데, 이렇게 그래프 형태로 정점과 간선이 주어졌을 때 어떻게 탐색할지 떠올리는게 어려웠다.
==> 우선 인접행렬에 그래프 정보를 저장하고, 반복문을 통해 정점을 순회!

profile
내가 보려고 쓰는 글
post-custom-banner

0개의 댓글