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

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

 

 

문제 분석

- 양방향으로 연결된 정점들을 DFS와 BFS로 탐색한다.

 

 

문제 풀이

- DFS

1. 해당 정점을 방문하여 방문 처리

2. 해당 정점을 출력값에 write

3. 해당 정점과 연결된 방문하지 않은 인접 정점을 재귀호출

 

- BFS

1. 처음 탐색을 시작할 정점을 덱에 넣고 방문처리

2. 탐색할 정점을 poll하고 출력값에 write

3. 해당 정점과 연결된 방문하지않은 인접 정점을 덱에 추가하고 방문처리

4. 탐색할 정점이 없을 때까지 반복

 

cf)

- 방문처리 배열의 경우 dfs메소드와 bfs메소드가 공유하기때문에 초기화 처리한다.

- dfs출력이 완료되면 꼭 줄바꿈 처리한다.

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
import java.util.StringTokenizer;

public class Main {

	private static int N, M, V;
	private static int[][] map;
	private static BufferedReader br;
	private static BufferedWriter bw;

	public static void main(String[] args) throws IOException {
		input();
		solution();
		output();
	}// main Function End

	private static void input() throws IOException {
		br = new BufferedReader(new InputStreamReader(System.in));
		bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;

		st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		V = Integer.parseInt(st.nextToken());

		map = new int[N + 1][N + 1];

		for (int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine());
			int start = Integer.parseInt(st.nextToken());
			int end = Integer.parseInt(st.nextToken());

			map[start][end] = 1; // 연결 표시
			map[end][start] = 1; // 양방향 처리
		} // for문 End
	}// input Function End

	private static void solution() throws IOException {
		boolean[] visited = new boolean[N + 1]; // 방문 여부 체크
		dfs(V, visited);
		bw.write("\n");
		Arrays.fill(visited, false);
		bfs(V, visited);
	}// solution Function End

	private static void dfs(int point, boolean[] visited) throws IOException {
		visited[point] = true; // 방문 처리
		bw.write(point + " ");

		for (int i = 1; i < N + 1; i++) {
			if (visited[i]) // 방문 여부 체크
				continue;
			if (map[point][i] == 0) // 연결이 되어있지 않은 정점이라면
				continue;

			dfs(i, visited);
		} // for문 End
	}// dfs Function End

	private static void bfs(int point, boolean[] visited) throws IOException {
		Deque<Integer> dq = new ArrayDeque<>();
		dq.add(point);
		visited[point] = true; // 방문 체크

		while (!dq.isEmpty()) {
			// 해당 정점 처리
			int cur = dq.poll();
			bw.write(cur + " ");

			for (int i = 1; i < N + 1; i++) { // 연결 정점 처리
				if (visited[i]) // 방문 여부 체크
					continue;
				if (map[cur][i] == 0) // 연결이 되어있지 않은 정점이라면
					continue;

				dq.add(i); // 다음 방문 정점 추가
				visited[i] = true; // 방문 처리
			}
		}
	}// bfs Function End

	private static void output() throws IOException {
		br.close();
		bw.flush();
		bw.close();
	}// output Function End
}// Class End

https://github.com/SOEUN2/Algorithm

'Algorithm > BOJ' 카테고리의 다른 글

BOJ 2667 단지번호붙이기  (0) 2021.08.29
BOJ 2606 바이러스  (0) 2021.08.27
BOJ 14503 로봇 청소기  (0) 2021.06.18
BOJ 16935 배열 돌리기 3  (0) 2021.06.11
BOJ 16927 배열 돌리기 2  (0) 2021.06.09