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

 

1260번: DFS와 BFS

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

www.acmicpc.net

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {

	static int N, M;
	static boolean[][] map;
	static boolean[] visited;
	static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		int V = Integer.parseInt(st.nextToken());
		map = new boolean[N + 1][N + 1];
		visited = new boolean[N + 1];

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

			map[from][to] = map[to][from] = true;
		}

		dfs(V);
		sb.append("\n");
		Arrays.fill(visited, false);
		bfs(V);

		System.out.println(sb);
	}

	private static void dfs(int v) {
		visited[v] = true;
		sb.append(v).append(" ");

		for (int i = 1; i <= N; i++) {
			if (map[v][i] && !visited[i]) {
				dfs(i);
			}
		}
	}

	private static void bfs(int v) {
		Queue<Integer> q = new LinkedList<>();

		q.offer(v);
		visited[v] = true;

		int curr = 0;
		while (!q.isEmpty()) {
			curr = q.poll();
			sb.append(curr).append(" ");

			for (int i = 1; i <= N; i++) {
				if (map[curr][i] && !visited[i]) {
					q.offer(i);
					visited[i] = true;
				}
			}
		}
	}
}

+ Recent posts