https://www.acmicpc.net/problem/11724
11724번: 연결 요소의 개수
첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.
www.acmicpc.net
문제
방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.
첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.
첫째 줄에 연결 요소의 개수를 출력한다.
풀이
- DFS 혹은 BFS를 이용하는 간단한 문제이다. 나는 DFS로 구현하였다.
- 먼저 주어진 간선 정보를 인접 리스트(ArrayList 배열)로 저장해준다. (편의상 1번 index부터 저장하도록 했다)
- 모든 정점들을 확인하며 방문하지 않은 노드가 있을 때마다 DFS를 실행한다.
- DFS가 한 번 끝날때마다 연결된 정점들에 대해 탐색이 끝나므로 그때마다 count를 해주면 된다.
- 모든 정점을 방문했다면 count값을 출력하고 종료.
import java.util.*; public class Main { static boolean check[]; static ArrayList[] adjlist; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int count = 0; check = new boolean[n+1]; //인접리스트 구현 adjlist = (ArrayList[]) new ArrayList[n+1]; for(int i=0; i<n+1; i++) { adjlist[i] = new ArrayList(); } for(int i=0; i<m; i++) { int vertex1 = sc.nextInt(); int vertex2 = sc.nextInt(); adjlist[vertex1].add(vertex2); adjlist[vertex2].add(vertex1); } //모든 정점 탐색 for(int i=1; i<n+1; i++) { if(check[i] == false) { dfs(i); count++; } } System.out.println(count); } static void dfs(int v) { check[v] = true; //방문 체크 //해당 정점에 연결되어 있는 정점들을 방문 for(int i=0; i<adjlist[v].size(); i++) { int x = adjlist[v].get(i); if(check[x] == false) dfs(x); } } }
'BOJ' 카테고리의 다른 글
[BOJ] 2606. 바이러스 (0) | 2019.05.01 |
---|---|
[BOJ] 4963. 섬의 개수 (0) | 2019.05.01 |
[BOJ] 7569. 토마토 (3차원) (0) | 2019.04.30 |
[BOJ] 7576. 토마토 (0) | 2019.04.30 |
[BOJ] 2309. 일곱 난쟁이 (0) | 2019.04.29 |