점점 강해지고 있습니다.
[Java] 백준 1260번: DFS와 BFS
풀이 방법
오랜만에 올리는 풀이일지다.
입력받은 정점(N)과 간선(M)을 인접행렬로 만든 후, DFS와 BFS의 특성을 이용해 시작지점(V)부터 탐색하면 되는 문제이다.
map[from][to] = map[to][from] = 1
을 쓰면 인접행렬을 더욱 쉽게 만들 수 있다는 꿀팁!
방문배열을 사용하여 한 번 방문한 곳은 다시 방문 못하게 처리를 하면 정답을 도출해낼 수 있을 것이다.
풀이 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class BOJ_1260_DFS와BFS {
static StringBuilder sb;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int V = Integer.parseInt(st.nextToken());
int[][] map = new int[N+1][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] = 1;
}
sb = new StringBuilder();
dfs(map, V, new boolean[N+1]);
sb.append("\n");
bfs(map, V);
System.out.println(sb);
}
private static void dfs(int[][] map, int node, boolean[] visit) {
sb.append(node+" ");
visit[node] = true;
for (int i = 1; i < map.length; i++) {
if(map[node][i] == 1 && !visit[i]) {
dfs(map, i, visit);
}
}
}
private static void bfs(int[][] map, int node) {
Queue<Integer> q = new LinkedList<Integer>();
boolean[] visit = new boolean[map.length+1];
visit[node] = true;
q.add(node);
while(!q.isEmpty()) {
int V = q.poll();
sb.append(V+" ");
for (int i = 1; i < map.length; i++) {
if(map[V][i] == 1 && !visit[i]) {
visit[i] = true;
q.add(i);
}
}
}
}
}
Thank You For Reading