문제 내용으로는 입력으로 정점, 간선 수 시작 위치를 받은 뒤 이후 정점간 연결 구조를 받은 뒤, 시작 위치에서부터 시작해서 양방향 그래프를 DFS와 BFS 방식으로 돌아준 후 방문 순서를 찍어주면 되는데
주의할 점은 방문할 수 있는 정점이 여러개라면 정점 번호가 작은 것(오름차순)부터 방문해야 한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
public class Main{
static Map<Integer, ArrayList<Integer>> graph = new HashMap<>();
static LinkedHashSet<Integer> dfsVisited = new LinkedHashSet<>();
static LinkedHashSet<Integer> bfsVisited = new LinkedHashSet<>();
public static void dfs(int start) {
dfsVisited.add(start);
if (graph.get(start) != null) {
for (int neighbor : graph.get(start)) {
if (!dfsVisited.contains(neighbor)) {
dfs(neighbor);
}
}
}
}
public static void bfs(int start) {
Queue<Integer> queue = new LinkedList<>();
queue.add(start);
bfsVisited.add(start);
while (!queue.isEmpty()) {
Integer poll = queue.poll();
if (graph.get(poll) != null) {
for (int neighbor : graph.get(poll)) {
if (!bfsVisited.contains(neighbor)) {
queue.add(neighbor);
bfsVisited.add(neighbor);
}
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// Vertex Edge Start
int[] split = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
for (int i = 0; i < split[1]; i++) {
int[] edge = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
graph.putIfAbsent(edge[0], new ArrayList<>());
graph.putIfAbsent(edge[1], new ArrayList<>());
graph.get(edge[0]).add(edge[1]);
graph.get(edge[1]).add(edge[0]); // 양방향
}
for (ArrayList<Integer> neighbor : graph.values()) {
Collections.sort(neighbor);
}
dfs(split[2]);
StringBuilder sb = new StringBuilder();
for (int i : dfsVisited) {
sb.append(i).append(" ");
}
System.out.println(sb.substring(0, sb.length() - 1));
bfs(split[2]);
StringBuilder sb2 = new StringBuilder();
for (int i : bfsVisited) {
sb2.append(i).append(" ");
}
System.out.println(sb2.substring(0, sb2.length() - 1));
}
}
DFS와 BFS 둘 다 사용할 줄 알아야 풀 수 있는 문제인데, 사용할 줄 안다면 주의할 점은 그래프에 간선 다 넣어주고 난 뒤에 정렬해주는 부분만 추가로 해 주면 되고
BFS의 경우에는 재귀, BFS의 경우에는 Queue를 사용해서 문제를 풀어주면 되겠다.
Leave a Reply