반응형
* 핵심
BFS or DFS를 이용하여 끊어진 갯수 구하기
* 문제
문제
방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.
출력
첫째 줄에 연결 요소의 개수를 출력한다.
* 소스코드(BFS & DFS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer stk = new StringTokenizer(br.readLine()); int n = Integer.parseInt(stk.nextToken()); int m = Integer.parseInt(stk.nextToken()); boolean[] visited = new boolean[n+1]; ArrayList<Integer>[] edge = new ArrayList[n+1]; for (int i = 0; i < n+1; i++) { edge[i] = new ArrayList<>(); } for (int i = 0; i < m; i++) { stk = new StringTokenizer(br.readLine()); int u = Integer.parseInt(stk.nextToken()); int v = Integer.parseInt(stk.nextToken()); edge[u].add(v); edge[v].add(u); } int ans = 0; for (int i = 1; i < m+1; i++) { //BFS if (!visited[i]){ ans++; Queue<Integer> q = new LinkedList<>(); q.add(i); while (!q.isEmpty()){ int tmp = q.poll(); if (!visited[tmp]) { visited[tmp] = true; for (int j = 0; j < edge[i].size(); j++) { q.add(edge[tmp].get(j)); } } } } //DFS if (!visited[i]){ ans++; dfs(i, edge, visited); } } System.out.println(ans); } //DFS public static void dfs(int v, ArrayList<Integer>[] edge, boolean[] visited){ if (!visited[v]){ visited[v] = true; for (int i = 0; i < edge[v].size(); i++) { dfs(edge[v].get(i), edge, visited); } } } } | cs |
반응형
'∙Algorithm' 카테고리의 다른 글
[Algorithm] 백준/2583 :: 영역 구하기 (0) | 2018.12.31 |
---|---|
[Algorithm] 백준/7576 :: 토마토 (0) | 2018.12.30 |
[Algorithm] 백준/1181 :: 단어 정렬 (0) | 2018.12.29 |
[Algorithm] 백준/14698 :: 전생했더니 슬라임 연구자였던 건에 대하여 (Hard) (0) | 2018.12.28 |