[規格]No 11724-接続要素数(JAVA)




接続要素とは?


まず연결요소(Connected Component)が何なのか分からなかったので探してみました.
1つのグラフィックが接続されていない小さなグラフィックから構成される場合、小さなグラフィックは接続要素と呼ばれます.
例えば、上記の例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問題は2次元配列の形で与えられており,このような図形形式で頂点と幹線を与えた場合にどのように探索するか想像しにくい.
=>>まず隣接マトリクスにグラフィック情報を格納し、文を繰り返して頂点を巡ります!