[문제]
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
[입력]
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.
[출력]
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
[예제]
>문제 풀이
DFS와 BFS에 대한 이해가 있었다면 풀 수 있는 가장 기본적인 문제인 것 같다.
그러나, 나는 이해가 없었기에,, 개념부터 공부하고 이 문제를 풀었다.
>전체 코드
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int N, M, V;
static int visit[], mat[][];
public static void main(String [] args) {
int p1, p2;
Scanner scan= new Scanner(System.in);
N= scan.nextInt();
M= scan.nextInt();
V= scan.nextInt();
visit= new int[N+1];
mat= new int[N+1][N+1];
for(int i=0; i<M; i++) {
p1= scan.nextInt();
p2= scan.nextInt();
mat[p1][p2]=mat[p2][p1]=1;
}
dfs(V);
System.out.println();
Arrays.fill(visit, 0); //초기화
bfs(V);
}
public static void dfs(int start) {
visit[start]=1;
System.out.print(start+" ");
for(int i=1; i<=N; i++) {
if(mat[start][i]==1 && visit[i]!=1) {
dfs(i);
}
}
}//dfs
public static void bfs(int start) {
int temp;
Queue<Integer> queue= new LinkedList<Integer>();
queue.offer(start);
visit[start]=1;
System.out.print(start+" ");
while(!queue.isEmpty()) {
temp= queue.poll();
for(int i=1; i<=N; i++) {
if(mat[temp][i]==1&&visit[i]!=1) {
queue.offer(i);
visit[i]= 1;
System.out.print(i+" ");
}
}
}
}//bfs
}
'알고리즘 > 백준 알고리즘' 카테고리의 다른 글
[백준 알고리즘]1012번: 유기농 배추_Java (0) | 2021.04.27 |
---|---|
[백준 알고리즘]2667번 단지번호 붙이기_Java (DFS풀이) (0) | 2021.04.26 |
[백준 알고리즘] 2606번 바이러스_Java (0) | 2021.04.24 |
[백준 알고리즘] 7579번: 앱_Java (0) | 2021.04.23 |
[백준 알고리즘] 2629번: 양팔저울_Java (0) | 2021.04.22 |