신규 블로그를 만들었습니다!
문제
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
입력
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 한 간선이 여러 번 주어질 수도 있는데, 간선이 하나만 있는 것으로 생각하면 된다. 입력으로 주어지는 간선은 양방향이다.
출력
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
예제입력
4 5 1
1 2
1 3
1 4
2 4
3 4
예제 출력
1 2 4 3
1 2 3 4
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Queue;
import java.util.LinkedList;
public class Dfs {
private static int n, m, v;
private static int[][] map;
private static boolean[] visit;
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
String[] temp = br.readLine().trim().split(" ");
n = Integer.parseInt(temp[0]);
m = Integer.parseInt(temp[1]);
v = Integer.parseInt(temp[2]);
map = new int[n+1][n+1];
visit = new boolean[n+1];
while(m-->0) {
temp = br.readLine().trim().split(" ");
int x = Integer.parseInt(temp[0]);
int y = Integer.parseInt(temp[1]);
map[x][y] = map[y][x] = 1;
}
// dfs 시작
dfs(v, n);
System.out.println("");
visit = new boolean[n+1];
// bfs 시작
bfs(v, n);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
private static void bfs(int k, int n) {
Queue<Integer> queue = new <Integer> LinkedList();
queue.offer(k);
while(!queue.isEmpty()) {
int temp = queue.poll();
visit[temp] = true;
System.out.print(temp + " ");
for(int i=1; i<=n; i++) {
if(map[temp][i] == 1 && !visit[i]) {
queue.offer(i);
visit[i]= true;
}
}
}
}
private static void dfs(int k, int n) {
// 방문한 경우 빠져나옴
if(visit[k]) {
return;
}
// 방문
visit[k] = true;
System.out.print(k+" ");
for(int i=1; i<=n; i++) {
if(map[k][i] == 1) {
dfs(i, n);
}
}
}
}
※ 직접 문제 풀고 돌려본 뒤, 채점까지 마친 후에 작성한 글입니다.
더 좋은 방법이 있다면, 댓글로 알려주시면 감사하겠습니다 :)
'Algorithm > 백준 온라인 저지' 카테고리의 다른 글
백준/11726번 :: 2xn 타일링 (Java 구현) - DP 다이나믹 프로그래밍 (4) | 2018.06.19 |
---|---|
백준/1463번 :: 1로 만들기 (Java 구현) DP -다이나믹 프로그래밍 (4) | 2018.06.19 |
백준/10817번 :: 세 수 (Java 코드) (6) | 2018.06.16 |
백준/2750번 :: 수 정렬하기 (Java 코드, 삽입 정렬, 퀵 정렬, insertion sort, quick sort) (4) | 2018.06.16 |
백준/1003번 :: 피보나치 함수 (C/C++ 구현) - DP, 메모이제이션 (2) | 2018.05.02 |
최근댓글