[JAVA/백준] DFS와 BFS: DFS와 BFS

👀 문제

https://www.acmicpc.net/problem/1260

👊 도전

1. 설계

  1. dfs, bfs를 구현한다.

2. 구현 (성공 코드)

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
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

/**
 * @author HEESOO
 *
 */
public class Main {
	static int[][] graph;
	static boolean[] visit;
	public static void dfs(int s) {
		if(visit[s]) return;
		
		visit[s]=true;
		System.out.print(s+" ");
		for(int i=1;i<visit.length;i++)
			if(!visit[i]&&graph[s][i]==1)
				dfs(i);
	}
	public static void bfs(int s) {
		Queue<Integer> q=new LinkedList<Integer>();
		q.add(s);
		visit[s]=true;
		while(!q.isEmpty()) {
			int now=q.poll();
			System.out.print(now+" ");
			for(int i=1;i<visit.length;i++) {
				if(graph[now][i]==1&&!visit[i]) {
					q.add(i);
					visit[i]=true;
				}
			}
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan = new Scanner(System.in);
		int n=scan.nextInt();
		int m=scan.nextInt();
		int v=scan.nextInt();
		graph=new int[n+1][n+1];
		visit=new boolean[n+1];
		for(int i=0;i<m;i++) {
			int x=scan.nextInt();
			int y=scan.nextInt();
			graph[x][y]=1;
			graph[y][x]=1;
		}
		
		dfs(v);
		System.out.println();
		Arrays.fill(visit, false);
		bfs(v);
	}
}

 

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. 그래프 탐색을 위해 필요한 변수들을 만든다
    • graph는 노드 간의 연결을 저장한다.
    • visit는 노드의 방문여부를 저장한다.
  2. DFS를 구현한다
    • DFS는 깊이 우선 탐색으로 현재 노드에 연결된 노드들의 탐색을 끝낸 후 다음 노드로 이동한다.
    • 재귀로 현재 노드에서 연결된 노드들 중에 방문하지 않은 곳을 탐색한다.
  3. BFS를 구현한다
    • BFS는 너비 우선 탐색으로 현재 레벨에 있는 노드들을 모두 탐색한 후 다음 레벨로 넘어간다.
    • 큐를 사용하여 현재 노드에 연결된 노드들 중 방문하지 않은 노드들을 저장하고, 넣은 순서대로 탐색한다.

👏 해결 완료!