본문 바로가기
알고리즘/문제 풀이

[Java] 백준 11724번 연결 요소의 개수

by _eunji_ 2020. 5. 22.

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

문제 설명

  • 방향 없는 그래프에서 연결 요소의 개수 구하기
  • N : 정점의 개수(1 ≤ N ≤ 1,000) 
  • M : 간선의 개수 (0 ≤ M ≤ N×(N-1)/2)
  • u,v : 양 끝점

 

재귀를 통한 DFS로 탐색하여 풀었고 방문 여부가 false일때까지 검사하여 cnt를 증가해준다.

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
import java.util.Stack;

public class Main {
	static boolean check[];
	static ArrayList<Integer> nodes[];
	public static void main(String[] args) {
		
		Scanner s= new Scanner(System.in);
		
		int N = s.nextInt(); //정점의 개수
		int M = s.nextInt(); //간선의 개수
		int cnt=0; //연결 요소 개수
		
		
		check =new boolean[N+1];
		nodes = new ArrayList[N+1];
		
		for(int i=1; i<=N; i++) {
			nodes[i] = new ArrayList<Integer>();
			check[i]=false;
		}
		
		for (int i = 0; i < M; i++) {
			int n1 = s.nextInt();
			int n2 = s.nextInt();	
			nodes[n1].add(n2); 
			nodes[n2].add(n1);
	}
		
		for(int i = 1; i < N+1; i++) {
			if(!check[i]) {
				dfs(i);
				cnt++;
			}
		}
		
		System.out.println(cnt);
		
		
		
	}
	
	public static void dfs(int v) {
		 if(check[v]) {
	            return;
	        }
		 check[v]=true;
	        for(int i : nodes[v]){
	            if(!check[i]) {
	                dfs(i);
	            }
	        }
		
	
	}
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[Java] 백준 1965번 상자넣기  (0) 2020.06.03
[Java] 백준 1049번 기타줄  (0) 2020.06.01
[Java] 백준 1026번 보물  (0) 2020.05.20
[Java] 백준 1890번 점프  (0) 2020.05.20
[Java] 백준 DFS와 BFS  (0) 2020.05.18

댓글