입력 : 첫째 줄 - 정점의 개수 N (1 ≤ N ≤ 1,000) / 간선의 개수 M (1 ≤ M ≤ 1,000) / 탐색을 시작할 정점의 번호 V
M개의 줄 - 간선이 연결하는 두 정점의 번호
두번째 줄의 수만큼 세번째 줄 반복
출력 : V부터 방문된 점을 순서대로 출력한다.
O(V + E)
V : 정점의 수
E : 간선의 수
DFS, BFS
import java.io.*;
import java.util.*;
public class Main {
private static ArrayList<Integer>[] adjacencyList;
private static boolean[] visited;
private static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] inputs = br.readLine().split(" ");
int n = Integer.parseInt(inputs[0]);
int m = Integer.parseInt(inputs[1]);
int v = Integer.parseInt(inputs[2]);
adjacencyList = new ArrayList[n + 1];
for (int i = 1; i <= n; i++) {
adjacencyList[i] = new ArrayList<>();
}
for (int i = 0; i < m; i++) {
inputs = br.readLine().split(" ");
int u = Integer.parseInt(inputs[0]);
int w = Integer.parseInt(inputs[1]);
adjacencyList[u].add(w);
adjacencyList[w].add(u);
}
for (int i = 1; i <= n; i++) {
Collections.sort(adjacencyList[i]);
}
visited = new boolean[n + 1];
dfs(v);
sb.append("\n");
visited = new boolean[n + 1];
bfs(v);
System.out.print(sb.toString());
}
private static void dfs(int node) {
visited[node] = true;
sb.append(node).append(" ");
for (int neighbor : adjacencyList[node]) {
if (!visited[neighbor]) {
dfs(neighbor);
}
}
}
private static void bfs(int start) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(start);
visited[start] = true;
while (!queue.isEmpty()) {
int node = queue.poll();
sb.append(node).append(" ");
for (int neighbor : adjacencyList[node]) {
if (!visited[neighbor]) {
visited[neighbor] = true;
queue.offer(neighbor);
}
}
}
}
}