https://www.acmicpc.net/problem/1260
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
해석 및 팁
이 문제는 DFS와 BFS의 기본을 활용하는 문제입니다. 자세한 내용은 링크를 참조하시기 바랍니다.
https://ko.wikipedia.org/wiki/깊이_우선_탐색
깊이 우선 탐색 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 깊이 우선 탐색의 애니메이션 예시 깊이 우선 탐색( - 優先探索, 영어: depth-first search, DFS)은 맹목적 탐색방법의 하나로 탐색트리의 최근에 첨가된 노드를 선택
ko.wikipedia.org
https://ko.wikipedia.org/wiki/너비_우선_탐색
너비 우선 탐색 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전.
ko.wikipedia.org
Java 코드
import java.util.Scanner;
import java.util.Queue;
import java.util.LinkedList;
public class Main {
static StringBuilder sb;
static int n;
static int m;
static int v;
static boolean[][] arr;
static boolean[] visit;
static Queue<Integer> q;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
q = new LinkedList<>();
sb = new StringBuilder();
n = sc.nextInt();
m = sc.nextInt();
v = sc.nextInt();
arr = new boolean[n+1][n+1];
visit = new boolean[n+1];
for(int i = 0; i < m; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
arr[a][b] = arr[b][a] = true;
}
dfs(v);
sb.append("\n");
visit = new boolean[n+1];
bfs(v);
System.out.println(sb);
}
static void dfs(int num) {
visit[num] = true;
sb.append(num+" ");
for(int i = 1; i <= n; i++) {
if(visit[i] == false && arr[num][i]) dfs(i);
}
}
static void bfs(int num) {
visit[num] = true;
q.add(num);
while(!q.isEmpty()) {
num = q.poll();
sb.append(num+" ");
for(int i = 1; i <= n; i++) {
if(visit[i] == false && arr[num][i]) {
q.add(i);
visit[i] = true;
}
}
}
}
}
'백준' 카테고리의 다른 글
백준 11053 가장 긴 증가하는 부분 수열(Java) (0) | 2023.02.05 |
---|---|
백준 1012 유기농 배추(Java) (0) | 2023.02.05 |
백준 1788 피보나치 수의 확장(Java) (0) | 2023.02.05 |
백준 9659 돌 게임 5(Java) (0) | 2023.02.05 |
백준 9996 한국이 그리울 땐 서버에 접속하지(Java) (0) | 2023.02.05 |