import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
class Main {
static Map<Integer, LinkedList<Integer>> graph = new HashMap<>();
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws Exception {
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // 정점 수
int M = Integer.parseInt(st.nextToken()); // 간선 수
int V = Integer.parseInt(st.nextToken()); // 탐색 시작점
initGraph(M); // 1. 인접리스트 그래프 초기화
List<Integer> discoveredDfs = dfs(V, new ArrayList<>()); // 2. DFS
List<Integer> discoveredBfs = bfs(V); // 3. BFS
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String dfs = discoveredDfs.stream().map(String::valueOf).collect(Collectors.joining(" "));
String bfs = discoveredBfs.stream().map(String::valueOf).collect(Collectors.joining(" "));
bw.write(dfs + "\n" + bfs);
bw.flush();
bw.close();
}
public static void initGraph(int M) throws IOException {
while(M-- > 0) {
StringTokenizer edge = new StringTokenizer(br.readLine());
int v = Integer.parseInt(edge.nextToken());
int w = Integer.parseInt(edge.nextToken());
addVertex(v, w);
addVertex(w, v);
}
graph.forEach((key, list) -> Collections.sort(list));
}
public static void addVertex(int p, int q) {
if(graph.containsKey(p))
graph.get(p).add(q);
else {
LinkedList<Integer> list = new LinkedList<>();
list.add(q);
graph.put(p, list);
}
}
public static List<Integer> dfs(int v, List<Integer> discovered) {
discovered.add(v);
if(!graph.containsKey(v)) // v에 인접한 정점이 없을 때 리턴
return discovered;
for(int w : graph.get(v)) // v의 인접 정점들 중 미방문 정점에 대해 dfs 수행
if(!discovered.contains(w))
dfs(w, discovered);
return discovered;
}
public static List<Integer> bfs(int st_v) {
List<Integer> discovered = new ArrayList<>();
Queue<Integer> queue = new LinkedList<>();
discovered.add(st_v);
queue.add(st_v);
while (!queue.isEmpty()) {
int v = queue.poll();
if(!graph.containsKey(v)) // v에 인접한 정점이 없을 때 패스
continue;
for(int w : graph.get(v)) // v의 인접 정점들 중 미방문 정점들에 대해 큐에 삽입
if(!discovered.contains(w)) {
discovered.add(w);
queue.add(w);
}
}
return discovered;
}
}
'개발 > Problem Solving' 카테고리의 다른 글
[BOJ] 백준 11725번 트리의 부모 찾기 - JAVA 자바 풀이 (1) | 2024.06.12 |
---|---|
[BOJ] 백준 1991번 트리 순회 - JAVA 자바 풀이 (0) | 2024.06.12 |
[BOJ] 백준 10799번 쇠막대기 - JAVA 자바 풀이 (0) | 2024.06.01 |
백준 2164 카드2 - Java 자바 문제 풀이 (1) | 2024.02.08 |
백준 10845 큐 - Java 자바 문제 풀이 (1) | 2024.02.08 |