DFS์ BFS๋ ์ฝ๋ฉ ํ ์คํธ์์ ํญ์ ๋จ๊ณจ ๋ฌธ์ ๋ก ์ถ์ ๋๋ ๋งค์ฐ ์ค์ํ ์๊ณ ๋ฆฌ์ฆ ์ค์ ํ๋์ด๋ค.
์ด์ ๋ถํฐ ์ด๋ ํ ๊ฒฝ์ฐ์ DFS์ BFS ๋ฌธ์ ๋ฅผ ์ ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํ์ด ํ ์ ์๋ ์ง ์์ฑํด ๋ณธ๋ค.
DFS
๊น์ด ์ฐ์ ํ์์ ๊ทธ๋ํ ์์ ํ์ ๊ธฐ๋ฒ ์ค์ ํ๋๋ก, ๊ทธ๋ํ์ ์์ ๋ ธ๋์์ ์ถ๋ฐํ์ฌ, ํ์ํ ํ ์ชฝ ๋ถ๊ธฐ๋ฅผ ์ ํด ํ์์ ๋ง์น ํ, ๋ค๋ฅธ ๋ถ๊ธฐ๋ก ์ด๋ํ์ฌ ํ์์ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
DFS(๊น์ด ์ฐ์ ํ์)์ ํน์ง
- ์ฌ๊ท ํจ์๋ก ๊ตฌํํ๋ค.(์ค์)
- ์คํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค.
์ค์ ๋ฌธ์ ํ์ด์์ DFS๋ ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ, ์ด ๋ ์คํ ์ค๋ฒํ๋ก์ฐ๋ฅผ ์ฃผ์ํด์ผ ํ๋ค.
DFS ๋ฌธ์ ์ ๋ํ ์ ํ์ ์ฃผ๋ก, ๋จ์ ์ ์ฐพ๊ธฐ, ๋จ์ ์ ์ฐพ๊ธฐ, ์ฌ์ดํด ์ฐพ๊ธฐ, ์์ ์ ๋ ฌ ๋ฑ์ ๋ฌธ์ ์ด๋ค.
DFS ๋ฌธ์ ์์
11724๋ฒ: ์ฐ๊ฒฐ ์์์ ๊ฐ์
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ N๊ณผ ๊ฐ์ ์ ๊ฐ์ M์ด ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) ๋์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์ ๊ฐ์ ์ ์ ๋์ u์ v๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ u, v ≤ N, u ≠ v) ๊ฐ์ ๊ฐ์ ์ ํ ๋ฒ๋ง ์ฃผ์ด
www.acmicpc.net
๋ฐฑ์ค 11724๋ฒ ๋ฌธ์ ๋ฅผ ํตํด ๊ธฐ๋ณธ์ ์ธ DFS ๊ตฌํ ๋ฐฉ๋ฒ์ ์ ์ ์๋ค.
import java.util.*;
import java.io.*;
public class Main {
static ArrayList<Integer>[] A;
static boolean visited[];
public static void main(String[] args) throws IOException {
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());
A = new ArrayList[N+1];
visited = new boolean[N+1];
for(int i=1; i<N+1; i++) {
A[i] = new ArrayList<Integer>();
}
for(int i=0; i<M; i++) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
A[s].add(e);
A[e].add(s);
}
int count = 0;
for(int i=1; i<N+1; i++) {
if(!visited[i]) {
count++;
DFS(i);
}
}
System.out.println(count);
}
static void DFS(int v) {
if (visited[v]) {
return;
}
visited[v] = true;
for(int i: A[v]) {
if(visited[i] == false) {
DFS(i);
}
}
}
}
DFS๋ BFS๊ฐ ์ฃผ๋ก ์ฌ์ฉ๋๋ ๋ฌธ์ ๋ ์์ ๊ฐ์ด ๋ ธ๋์ ์์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๊ทธ๋์ ๊ฐ ๋ ธ๋๋ค์ด ์ด๋ค ๋ ธ๋์ ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ง ์ฐ๊ฒฐํ์ฌ ์ ์ฅํ์ฌ์ผ ํ๋๋ฐ,
์ด ๋ ์๋ฐ์์๋ ์ธ์ ๋ฆฌ์คํธ(ArrayList) ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ์ด์ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ํ๋ค.
- DFS๋ ์ฌ๊ท ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋๊ฐ ๋ง๋ค.(๊ฐ๋ ์ ์คํ)
- ๋ฐฉ๋ฌธ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ฉฐ, ์ธ์ ๋ฆฌ์คํธ์์ ๊ฐ๋ค์ ์ฌ๊ท ํจ์๋ก ๋ฐฉ๋ฌธํ๋ฉฐ ํ์ํ๋ค.
DFS ๋ฌธ์ ์์ 2
2023๋ฒ: ์ ๊ธฐํ ์์
์๋น์ด๊ฐ ์ธ์์์ ๊ฐ์ฅ ์ข์ํ๋ ๊ฒ์ ์์์ด๊ณ , ์ทจ๋ฏธ๋ ์์๋ฅผ ๊ฐ์ง๊ณ ๋ ธ๋ ๊ฒ์ด๋ค. ์์ฆ ์๋น์ด๊ฐ ๊ฐ์ฅ ๊ด์ฌ์์ด ํ๋ ์์๋ 7331์ด๋ค. 7331์ ์์์ธ๋ฐ, ์ ๊ธฐํ๊ฒ๋ 733๋ ์์์ด๊ณ , 73๋ ์์
www.acmicpc.net
๋ค์์ ๋ฐฑ์ค 2023๋ฒ ๋ฌธ์ ๋ฅผ ํตํด ์กฐ๊ธ ๋ ์ด๋ ค์ด DFS ๋ฌธ์ ์ ์์๋ฅผ ์ดํด๋ณด์.
ํด๋น ๋ฌธ์ ๋ ์๋ฆฟ์ ๋ณ๋ก ํ์์ ํด๋๊ฐ๋ฉฐ, ์์์์ ๋ฐํ๋ด๋ ๋ฌธ์ ์ธ๋ฐ,
์ฌ๊ธฐ์ DFS๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ ์ ํ ๊ฐ์ง์น๊ธฐ์ ํ์์ ๋ณํํ์ฌ ์งํํ ์ ์๋ค.
import java.util.*;
import java.io.*;
public class Main {
static int n;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
DFS(2, 1);
DFS(3, 1);
DFS(5, 1);
DFS(7, 1);
}
static void DFS(int num, int jarisu) {
if(jarisu == n) {
if (isPrime(num)) {
System.out.println(num);
}
}
for(int i=1; i<=9; i++) {
if(i % 2 == 1 && isPrime(num)) {
DFS(num * 10 + i, jarisu +1);
}
}
}
static boolean isPrime(int num) {
for(int i=2; i<=num/2; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
}
- ์ฒซ ๋ฒ์งธ ์๋ฆฟ์๋ ์์ ๊ทธ ์์ฒด ๋ฐ์ ๋ชป ์ค๋ฏ๋ก, 2, 3, 5, 7 ๋ง ์ฌ ์ ์๋ค.
- ๊ทธ ๋ค์ ์๋ฆฟ์๋ ์ง์๋ ์๋๋ฏ๋ก(10์ด์์ ์ง์ ์ค์ ์์๋ ์์), ํ์๋ง ๊ฐ์ง์น๊ธฐ
- ์ฆ, ์ด ๋ฌธ์ ์์์ DFS๋ ์๋ฆฟ์์ ์์ ํ๋ณ์ ํตํด ๊ตฌ์ฑ๋๋ค.
DFS ๋ฌธ์ ์์ 3
13023๋ฒ: ABCDE
๋ฌธ์ ์ ์กฐ๊ฑด์ ๋ง๋ A, B, C, D, E๊ฐ ์กด์ฌํ๋ฉด 1์ ์์ผ๋ฉด 0์ ์ถ๋ ฅํ๋ค.
www.acmicpc.net
์ฌ์ค ์ด ๋ฌธ์ ๋ DFS์ ๊ฐ๋ ์ ๋์ ํ ์ค ๋ง ์๋ฉด, ๊ทธ๋ ๊ฒ ๋์ ๋ฑ๊ธ์ ๋ฌธ์ ๋ ์๋๋ผ๊ณ ์๊ฐํ๋ค.
์ฌ๊ท ๊น์ด ์์ฒด๊ฐ ๋ต์ ๋์ถํ๋ ํต์ฌ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
import java.util.*;
import java.io.*;
public class Main {
static ArrayList<Integer>[] A;
static boolean[] visited;
static boolean arrive;
public static void main(String[] args) throws IOException {
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());
visited = new boolean[n];
A = new ArrayList[n];
arrive = false;
for(int i=0; i<n; i++) {
A[i] = new ArrayList<>();
}
for(int i=0; i<m; i++) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
A[s].add(e);
A[e].add(s);
}
for(int i=0; i<n; i++) {
DFS(i, 1);
if(arrive) {
break;
}
}
if (arrive) {
System.out.println("1");
} else {
System.out.println("0");
}
}
static void DFS(int now, int depth) {
if (depth == 5 || arrive) {
arrive = true;
return;
}
visited[now] = true;
for(int i : A[now]) {
if (!visited[i]) {
DFS(i, depth+1);
}
}
visited[now] = false;
}
}
- DFS์์๋ ์ฐ๊ฒฐ๋ ์์ง์ ๋ํด์ ์ฌ๊ทํจ์๋ฅผ ๊ณ์ ํธ์ถํ ๊ฒ์ด๋ค.
- ์ด ๋ง์ ์๋ฏธ๋ ํธ์ถ๋ ํ์๊ฐ ์น๊ตฌ์ ์์ ๊ฐ๋ค๋ฉด, ์น๊ตฌ๋ค๋ผ๋ฆฌ๋ ๋์ด์ง ๊ณณ ์์ด ์ฐ๊ฒฐ๋์ด ์๋ค๋ ๊ฒ์ด๋ค.
- ์ธ์ ๋ฆฌ์คํธ๋ฅผ ํตํด์ ์๊ฐ๋ณด๋ค ์ฝ๊ฒ ํ์ด์ค ์ ์๋ค.
BFS
๋๋น ์ฐ์ ํ์๋ํ ๊ทธ๋ํ๋ฅผ ์์ ํ์ํ๋ ๋ฐฉ๋ฒ ์ค์ ํ๋์ด๋ค. ์ด๋ ์์ ๋ ธ๋์์ ์ถ๋ฐํ์ฌ ๊ฐ๊น์ด ๋ ธ๋๋ฅผ ๋จผ์ ๋ฐฉ๋ฌธํ๋ฉฐ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
BFS(๋๋น ์ฐ์ ํ์)์ ํน์ง
- FIFO ํ์์ด๋ค.
- Queue ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค.
๋ํ ๋ ธ๋ ์(V)์ ์์ง ์(E)์ ๋ฐ๋ผ ์๊ฐ ๋ณต์ก๋๊ฐ ๊ฒฐ์ ๋จ์ DFS์ ๋์ผํ๋ค.(O(V+E))
๊ทธ๋ ๋ค๋ฉด ๋๋น ์ฐ์ ํ์์ ๊น์ด ์ฐ์ ํ์๊ณผ ์ด๋ค ์ ์์ ์ฐจ์ด์ ์ ๋๊น? ๊ทธ๊ฑด ๋ฐ๋ก ๋๋น ์ฐ์ ํ์์ ํ์ ์์ ๋ ธ๋์ ๊ฐ๊น์ด ๋ ธ๋๋ฅผ ์ฐ์ ์ผ๋ก ํ์ํ๊ธฐ์ ๋ชฉํ ๋ ธ๋๋ก ๋์ฐฉํ๋ ๊ฒฝ๋ก๊ฐ ์ฌ๋ฌ๊ฐ ์ผ ๋, ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ณด์ฅํ๋ค.
์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ณด์ฅํ๋ค๋ ๊ฒ์ ๊ต์ฅํ ์ด์ ์ด์, ์ด์ฉํ ์ ์๋ ๋ฉด์ด ๋ง๋ค๋ ๊ฒ์ ์๋ฏธํ๊ธฐ๋ ํ๋ค.
How to Work?
์ด์ ์ DFS๋ ์ฌ๊ทํจ์(์คํ)๋ฅผ ์ด์ฉํ๋ค. BFS๋ ์ด๋ฆ์ ๋น์ทํด ๋ณด์ด์ง๋ง, ๋๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋๋๋ ๊ฒ์ ๋ถ๋ช ์๋ ๊ฒ์ด๋ค.
BFS๋ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ค. ์ฐ๋ฆฌ๊ฐ ์ด์ ์ DFS๋ ์คํ ๋์ ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ์ง๋ง, BFS๋ ํ ์๋ฃ๊ตฌ์กฐ ๊ทธ ์์ฒด๋ฅผ ์ฌ์ฉํด์ผ ๊ฐํธํ๋ค.
๋จ, DFS์ ๋์ผํ๊ฒ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ, ์คํ(์ฌ๊ทํจ์)์ ์ง์ด ๋ฃ์๋ ๊ฒ๊ณผ๋ ๋ณ๊ฐ๋ก ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด ํ์ ์ฝ์ ํ๋ค๋ ๊ฒ์ด๋ค.
- BFS๋ ๊ตฌํ์ ์์ด์ Queue ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ค.
- BFS๋ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ค.
BFS ๋ฌธ์ ์์ 1
์๋ฐํ ๋งํด์ ์ด ๋ฌธ์ ๋ DFS์ BFS๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๋ ์ข์ ์์์ด๋ค.
import java.util.*;
import java.io.*;
public class Main {
static ArrayList<Integer>[] A;
static boolean[] visited;
public static void main(String[] args) throws IOException {
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 start = Integer.parseInt(st.nextToken());
A = new ArrayList[n+1];
for(int i=1; i<=n; i++) {
A[i] = new ArrayList<>();
}
for(int i=0; i<m; i++) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
A[s].add(e);
A[e].add(s);
}
for(int i=1; i<=n; i++) {
Collections.sort(A[i]);
}
visited = new boolean[n+1];
DFS(start);
System.out.println();
visited = new boolean[n+1];
BFS(start);
System.out.println();
}
public static void DFS(int Node) {
System.out.print(Node + " ");
visited[Node] = true;
for(int i: A[Node]) {
if (!visited[i]) {
DFS(i);
}
}
}
private static void BFS(int Node) {
Queue<Integer> queue = new LinkedList<Integer>();
queue.add(Node);
visited[Node] = true;
while(!queue.isEmpty()) {
int now_node = queue.poll();
System.out.print(now_node + " ");
for(int i : A[now_node]) {
if (!visited[i]) {
visited[i] = true;
queue.add(i);
}
}
}
}
}
์ ์ฒ๋ผ BFS ๊ตฌํ ์์๋ Queue ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค.
BFS์์๋?
- Queue ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค.
- ๋ฐฉ๋ฌธ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค.
- queue๊ฐ ๋น ๋๊น์ง ๊ฒ์ฌ๋ฅผ ํ๋๋ฐ, poll ํ ๊ฐ์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฐจ๋ก๋ก ๋ฐฉ๋ฌธํ๋ฉฐ, ํ์ ์ฝ์ ํ๋ค.
BFS ๋ฌธ์ ์์ 2
์ด ๋ฌธ์ ๋ BFS ๋ฌธ์ ์ ๋ํ์ ์ธ ์์๋ผ๊ณ ์๊ฐํ๋ค. ๋ฏธ๋ก ํ์์ ๊ดํ ๋ฌธ์ ์ด๋ค.
2178๋ฒ: ๋ฏธ๋ก ํ์
์ฒซ์งธ ์ค์ ๋ ์ ์ N, M(2 ≤ N, M ≤ 100)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ M๊ฐ์ ์ ์๋ก ๋ฏธ๋ก๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ๊ฐ์ ์๋ค์ ๋ถ์ด์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
www.acmicpc.net
import java.util.*;
import java.io.*;
public class Main {
static int[][] A;
static int n, m;
static boolean[][] visited;
static int[] dx = { 0, 1, 0, -1 };
static int[] dy = { 1, 0, -1, 0 };
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
A = new int[n][m];
visited = new boolean[n][m];
for(int i=0; i<n; i++) {
st = new StringTokenizer(br.readLine());
String line = st.nextToken();
for(int j=0; j<m; j++) {
A[i][j] = Integer.parseInt(line.substring(j, j+1));
}
}
BFS(0, 0);
System.out.println(A[n-1][m-1]);
}
public static void BFS(int i, int j) {
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[] { i, j});
visited[i][j] = true;
while(!queue.isEmpty()) {
int now[] = queue.poll();
for(int k=0; k<4; k++) {
int x = now[0] + dx[k];
int y = now[1] + dy[k];
if(x >= 0 && y >=0 && x<n && y<m) {
if(A[x][y] != 0 && !visited[x][y]) {
visited[x][y] = true;
A[x][y] = A[now[0]][now[1]] + 1;
queue.add(new int[] { x, y });
}
}
}
}
}
}
๊ฐ๋ ๋ง ์ ๋๋ก ์์งํ๋ ๊ณ ์๋๋ค์ ์ฝ๊ฒ ์๊ฐํด ๋ผ ์ ์์ง๋ง, ์๊ณ ๋ฆฌ์ฆ์ ์ต์์น ์์ ์ด๋ค์๊ฒ๋ ์์ํ ๋ฐฉ์์ด๋ค.
์ ๋ ฅ ๋ฐ๋ ๋ถ๋ถ๋ ํ์ด์ฌ์ผ๋ก ํ๋ค๋ฉด, ๊ฐ๋จํ๊ฒ ํ ์ ์๋ ๋ถ๋ถ์ด๋ค. ํ์ง๋ง, StringTokenizer์ substring์ ํตํด์ ํ๋ ํ๋ ๋ฐ๋ ๋ฐฉ์์ ๋ฒ๊ฑฐ๋กญ๊ธฐ๋ ํ๊ณ , ์๋ชฉ ๊ด์ ์ ์ ์ํฅ์ ๋ฏธ์น๊ธฐ๋ ํ๋ค.(๋ฌผ๋ก ๋ ์ฝ๋ฉ ๊ณ ์๊ฐ ๋ ๊ฒ ๊ฐ์ ๋๋์ด์ด์ ์ข๋ค.. ํํ)
- ๋ฐฉํฅ ๋ฒกํฐ๋ฅผ ์ฌ์ฉํ์.(dx์ dy๋ฅผ ์ ์ธํด ์ค์ผ๋ก์จ, for๋ฌธ์ผ๋ก ์ฝ๊ฒ ๋ฐฉ๋ฌธ ์ ์ฐจ๋ฅผ ๋ง๋ค ์ ์๋ค.)
- Queue์ ๊ฐ ์์๋ ํ๊ณผ ์ด์ ๊ฐ index ๊ฐ์ ๊ฐ์ง ๊ฐ์ด๋ค. ๊ทธ๋์ผ, ๊ฐ๊ฐ์ ๋ฏธ๋ก ์ง์ ์์ฒด๋ฅผ ๋ฐฉ๋ฌธ ์ง์ ์ผ๋ก์จ, ์ ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ด์ BFS์ ๋์ ๋ฐฉ์์ ๋์ผํ๋ค. ๋จ, poll ํ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ ๋ฆฌ์คํธ๊ฐ ์๋ ๊ฒ์ด ์๋, ๋ฐฉํฅ ๋ฒกํฐ for๋ฌธ์ ๋๋ ค, ๊ฐ๊ฐ ํ์์ ์ด์ด๋๊ฐ๋ค.
- ๋ฒ์ ์ฒดํฌ๋ ํด์ฃผ์ด์ผ ํ๋ค.
- ํ์์ ์๋ฃํ ์ง์ ์ +1์ฉ ์ ๋ต ๋ฐฐ์ด์ ๋ํด์ฃผ๋ฉฐ, queue์ ์ฝ์ ํ๋ค.
BFS ๋ฌธ์ ์์ 3
๋ง์ง๋ง BFS ๋ฌธ์ ์ด๋ค. ์ด ๋ฌธ์ ๋ ์ผ๋ฐ์ ์ผ๋ก BFS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์ธ์ ๋ง์ ์๊ฐ์ ํ์๋ก ํ๋ค.
1167๋ฒ: ํธ๋ฆฌ์ ์ง๋ฆ
ํธ๋ฆฌ๊ฐ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค. ๋จผ์ ์ฒซ ๋ฒ์งธ ์ค์์๋ ํธ๋ฆฌ์ ์ ์ ์ ๊ฐ์ V๊ฐ ์ฃผ์ด์ง๊ณ (2 ≤ V ≤ 100,000)๋์งธ ์ค๋ถํฐ V๊ฐ์ ์ค์ ๊ฑธ์ณ ๊ฐ์ ์ ์ ๋ณด๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฃผ์ด์ง๋ค. ์ ์ ๋ฒํธ๋ 1๋ถํฐ V๊น์ง
www.acmicpc.net
import java.util.*;
import java.io.*;
public class Main {
static ArrayList<Edge>[] A;
static int n, m;
static boolean[] visited;
static int[] distance;
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
A = new ArrayList[n+1];
for(int i=1; i<=n; i++) {
A[i] = new ArrayList<Edge>();
}
for(int i=0; i<n; i++) {
int S = sc.nextInt();
while(true) {
int E = sc.nextInt();
if (E == -1) {
break;
}
int V = sc.nextInt();
A[S].add(new Edge(E, V));
}
}
distance = new int[n+1];
visited = new boolean[n+1];
BFS(1);
int Max = 1;
for(int i=2; i<=n; i++) {
if (distance[Max] < distance[i]) {
Max = i;
}
}
distance = new int[n+1];
visited = new boolean[n+1];
BFS(Max);
Arrays.sort(distance);
System.out.println(distance[n]);
}
private static void BFS(int index) {
Queue<Integer> queue = new LinkedList<>();
queue.add(index);
visited[index] = true;
while(!queue.isEmpty()) {
int now_node = queue.poll();
for(Edge i : A[now_node]) {
int e = i.e;
int v = i.value;
if(!visited[e]) {
visited[e] = true;
queue.add(e);
distance[e] = distance[now_node] + v;
}
}
}
}
}
class Edge {
int e;
int value;
public Edge(int e, int value) {
this.e = e;
this.value = value;
}
}
์ด ๋ฌธ์ ๊ฐ ์ด๋ ค์ด ์ด์ ๋ ๊ฐ์ค์น๋ผ๋ ๊ฒ์ด ์กด์ฌํ๋ ๊ฒ๋ ์๊ธด ํ๋ค.
๊ทธ๋ํ์์ ๋ ธ๋์ ๋ ธ๋ ์ฌ์ด(์์ง)์ ๊ฐ์ค์น๋ผ๋ ๊ฒ์ด ๋ํด์ง๋ฉด, ๋ต์ ๊ธฐ์ค์ด ๋ฐ๋๊ณค ํ๋ค.
์๋ฐ์์๋ ์ด๋ฅผ ํํํ๊ธฐ ์ํด ํด๋์ค๋ก ์์ง๋ฅผ ๋์ด, ๋ ธ๋์ ๊ฐ์ค์น๋ฅผ ํ ๋ฒ์ ์ด๊ธฐํ ํ ์ ์๋๋ก ํ๋ค.
- ArrayList์ ์ ๋ค๋ฆญ ํ์ ์ Edge์ด๋ค.
- ์์์ ๋ ธ๋์์ ๊ฐ์ฅ ๊ธด ๊ฒฝ๋ก๋ก ์ฐ๊ฒฐ๋์ด ์๋ ๋ ธ๋๋ ํธ๋ฆฌ์ ์ง๋ฆ์ ํด๋นํ๋ ๋ ๋ ธ๋ ์ค์ ํ๋์ด๋ค.
- ์ฆ, ๊ฑฐ๋ฆฌ ๋ฐฐ์ด์ ๋ง๋ค์ด ์ด ๊ณผ์ ์ ์ํํ ์ ์๋ค.
- BFS๋ ๊ฒฐ๊ตญ ํ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ํด๋น ๋ ธ๋๊น์ง ๊ฐ ์ ์๋ ํ์ ๊ฑฐ๋ฆฌ(๊ฐ์ค์น)๋ฅผ ๋ํด๊ฐ๋ฉฐ, ๊ฑฐ๋ฆฌ ๋ฐฐ์ด์ ์์ฑํ ์ ์๋ค.
- BFS๋ฅผ ๋ ๋ฒ ํ๋ ์ด์ ๋, ์ฒซ ๋ฒ์งธ ์์์ ๋ ธ๋์์ ์ฐพ์ ๋ชจ๋ ๋ ธ๋์ ๋ํ ๊ฑฐ๋ฆฌ ์ค ๊ฐ์ฅ ๊ธด ๊ฑฐ๋ฆฌ๊ฐ ๋ฐ๋ก ํธ๋ฆฌ์ ์ง๋ฆ์ ํด๋นํ๋ ๋ ๋ ธ๋ ์ค ํ๋์ธ ๊ฒ์ด๊ณ ,
์ด ๋ ธ๋์ BFS๋ฅผ ์ํํจ์ ํตํด, ๊ฐ์ฅ ๋ฉ๋ฆฌ ๋จ์ด์ง ๋ ธ๋๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ์์๋ผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
BFS๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ์ ์์ ๋ฟ๋ง ์๋๋ผ,
ํ์ ๊ฒฝ๋ก์ ๋ํ ๊ฐ์ค์น๋ฅผ ๋ํด ๊ฐ๋ฉฐ, ์ํ๋ ํ์ ๋์๋ ์ฐพ์ ์ ์๋ค๋ ๊ฒ์ด๋ค.
Reference
- Do it! ์ฝ๋ฉ ํ ์คํธ - ๊ธฐ์ด ํธ
'๐ Knowledge > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ (0) | 2023.08.28 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ๋ ๋ฐ์ดํฐ์์์ ํ์, ์ด์ง ํ์ (0) | 2023.08.26 |
[์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ(๋ณํฉ, ๊ธฐ์) ์๊ณ ๋ฆฌ์ฆ (3) (0) | 2023.08.18 |
[์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ(ํต ์ํธ) ์๊ณ ๋ฆฌ์ฆ (2) (0) | 2023.08.14 |
[์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ(๋ฒ๋ธ, ์ ํ, ์ฝ์ ) ์๊ณ ๋ฆฌ์ฆ (1) (0) | 2023.08.13 |