반응형

[Baekjoon][https://www.acmicpc.net/problem/11724]

깊이 우선 탐색(DFS) 알고리즘

예제 입력 1 > 로 주어진 각 N개의 정점을 연결하는 간선을 아래 그림과 같이 표현할 수 있다.

[풀이]

연결된 노드를 map[정점1][정점2] = 1 로 주며, 해당 노드의 방문 여부는 visit[정점] 변수로 주어

DFS 알고리즘을 탐색하며 연결된 map[정점1][정점2] && visit[정점] = 0(방문하지 않은 정점)

조건으로 연결된 정점 탐색이 끝날때마다 결과를 +1 씩 증가해주도록 풀이했다.

(* map[정점2][정점1] 또한 연결된 값이므로 =1 처리)

 

또한, 정점이 3, 연결된 간선이 1개로 아래 그림과 같이 처리된 케이스 체크를 위해

방문하지 않은 visit[정점]=0 인 케이스를 체크해서 결과값 +1씩 처리하였다.

import java.util.Scanner;

public class Main {

	static int n;
	static int m;
	static int map[][];
	static int visit[];
	static int cnt = 0;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Scanner sc = new Scanner(System.in);
		
		n = sc.nextInt();
		m = sc.nextInt();
		map = new int[n+1][n+1];
		visit = new int[n+1];
		
		for(int i=0;i<m;i++)
		{
			int u = sc.nextInt();
			int v = sc.nextInt();
			
			map[u][v] = 1;
			map[v][u] = 1;
		}
		
		for(int i=1;i<=n;i++) {
			for(int j=1;j<=n;j++) {
				if(map[i][j] == 1 && visit[j] == 0) {
					getDFS(i);
					cnt++;
				}
			}
		}
		
		for(int i=1;i<=n;i++) {
			if(visit[i] == 0) {
				cnt++;
			}
		}
		
		System.out.println(cnt);
	}
	
	public static void getDFS(int x)
	{
		visit[x] = 1;
		
		for(int i=1;i<=n;i++) {
			if(map[x][i] == 1 && visit[i] == 0) {
				getDFS(i);
			}
		}
	}
}
반응형

'알고리즘 > Baekjoon' 카테고리의 다른 글

[ Baekjoon ] #5427 불  (0) 2020.04.20
[ Baekjoon ] #4179 불!  (0) 2020.04.19
[ Baekjoon ] #2668 숫자 고르기  (0) 2020.04.18
[ Baekjoon ] #1463 1로 만들기  (0) 2020.03.01
[ Baekjoon ] #10026 적록색약  (0) 2020.02.22

+ Recent posts