π λ¬Έμ μ€λͺ
- μ
λ ₯: 첫째 μ€μ 곡백μ λκ³ μ μ N, M, Vλ₯Ό ν μ€μ μ
λ ₯ λ°λλ€.
- N: μ μ μ κ°μ
- M: κ°μ μ κ°μ
- V: νμμ μμν μ μ μ λ²νΈ (1 - N)
- μΈ¨λ ₯: 첫째 μ€μ DFSλ₯Ό μνν κ²°κ³Όλ₯Ό, κ·Έ λ€μ μ€μλ BFSλ₯Ό μνν κ²°κ³Όλ₯Ό μΆλ ₯νλ€.
- VλΆν° λ°©λ¬Έλ μ μ μμλλ‘ μΆλ ₯
- λ°©λ¬Έν μ μλ μ μ μ΄ μ¬λ¬κ°μΈ κ²½μ° μ μ λ²νΈκ° μμκ²μ λ¨Όμ λ°©λ¬Έ
- μ μ΄μ λ°©λ¬Έν μ μλ μ μ μ΄ μλ κ²½μ° μ’ λ£
π‘ μμ΄λμ΄
- 첫 μ€μμ μ μ μ N, κ°μ μ M, μμ μ μ Vλ₯Ό
StringTokenizer
λ‘ νλ²μ νμ±νλ€. - κ·Έλνλ μΈμ 리μ€νΈ λ°©μμΌλ‘ νννλ€.
- κ° μ μ λ§λ€ μ°κ²°λ μ μ μ μ μ₯νκΈ° μν΄
ArrayList<Integer>[]
λ°°μ΄μ μ¬μ©
- κ° μ μ λ§λ€ μ°κ²°λ μ μ μ μ μ₯νκΈ° μν΄
- μλ°©ν₯ κ°μ μ
λ ₯μ μν΄
adj[a].add(b)
μadj[b].add(a)
λ₯Ό μ¬μ©νλ€. - βμ μ λ²νΈκ° μμ κ² λΆν° λ°©λ¬Ένλ€βλΌλ κ·μΉμ μν΄μ μΈμ 리μ€νΈ(
adj[i]
)λ₯ΌCollections.sort()
λ‘ μ€λ¦μ°¨μμΌλ‘ μ λ ¬νλ€. - DFS, BFS νμ μΆλ ₯μμ, λ°©λ¬Έ λ°°μ΄μ λ§€λ² μ΄κΈ°ν ν΄μ€λ€. (
visited = new boolean[N + 1];
) κ·Έλ μ§ μμΌλ©΄ νμ κ²°κ³Όκ° μ€μΌ λ μ μλ€. - DFS λ‘μ§μ μ¬κ·λ‘ ꡬννκ³ , BFS λ‘μ§μ νλ‘ κ΅¬ννλ€.
- DFSλ
v
λ°©λ¬Έ μ μ μ체λ₯Ό λ§€κ°λ³μλ‘ λ°λλ€. - BFSμ λ§€κ°λ³μλ startλ‘, μμμ λ§ μ μν΄μ€ λΏμ΄λ€.
- μ΄ν μΈμ μ μ μ
queue.offer()
λ‘ νμ μΆκ°νλ€. - κ·Έλ¬λ―λ‘
.poll
ν¨μλ₯Ό μ¬μ©ν΄μ μ΄λ―Έ λ°©λ¬Έν μ μ μ μμ νμ¬ μ μ λ°©λ¬Έ μμλ₯Ό μ μ΄νλ€.
- DFSλ
π μμ κ·Έλν μκ°ν
π μ½λ
β¨ μ μΆ μ½λ
import java.io.*;
import java.util.*;
public class Main {
// μ μ μ, κ°μ μ, μμ μ μ λ²νΈ
static int N, M, V;
// μΈμ 리μ€νΈ (μ μ λ§λ€ μ°κ²°λ μ μ λͺ©λ‘)
static List<Integer>[] adj;
// λ°©λ¬Έ μ¬λΆ μ μ₯ λ°°μ΄
static boolean[] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
V = Integer.parseInt(st.nextToken());
// κ·Έλν μ΄κΈ°ν (1~N)
adj = new ArrayList[N + 1];
for (int i = 1; i <= N; i++) {
adj[i] = new ArrayList<>();
}
// κ°μ μ 보 μ
λ ₯
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
// μλ°©ν₯ μ
λ ₯
adj[a].add(b);
adj[b].add(a);
}
// μμ μ μ μ λ¨Όμ λ°©λ¬ΈνκΈ° μν μ λ ¬
for (int i = 1; i <= N; i++) {
Collections.sort(adj[i]);
}
// DFS μΆλ ₯
visited = new boolean[N + 1];
dfs(V);
System.out.println();
// BFS μΆλ ₯
visited = new boolean[N + 1];
bfs(V);
System.out.println();
}
// DFS - μ¬κ·λ‘ ꡬν
static void dfs(int v) {
visited[v] = true;
System.out.print(v + " ");
for (int nxt : adj[v]) {
if (!visited[nxt]) {
dfs(nxt);
}
}
}
// BFS - νλ‘ κ΅¬ν
static void bfs(int start) {
Queue<Integer> queue = new LinkedList<>();
visited[start] = true;
queue.offer(start);
while (!queue.isEmpty()) {
int v = queue.poll();
System.out.print(v + " ");
for (int nxt : adj[v]) {
if (!visited[nxt]) {
visited[nxt] = true;
queue.offer(nxt);
}
}
}
}
}
πͺ λλ²κΉ μ½λ
import java.io.*;
import java.util.*;
public class Main {
// μ μ μ, κ°μ μ, μμ μ μ λ²νΈ
static int N, M, V;
// μΈμ 리μ€νΈ (μ μ λ§λ€ μ°κ²°λ μ μ λͺ©λ‘)
static List<Integer>[] adj;
// λ°©λ¬Έ μ¬λΆ μ μ₯ λ°°μ΄
static boolean[] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
V = Integer.parseInt(st.nextToken());
System.out.println("N=" + N + ", M=" + M + ", V=" + V);
// κ·Έλν μ΄κΈ°ν (1~N)
adj = new ArrayList[N + 1];
for (int i = 1; i <= N; i++) {
adj[i] = new ArrayList<>();
}
// κ°μ μ 보 μ
λ ₯
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
adj[a].add(b); // a β b μ°κ²°
adj[b].add(a); // b β a μ°κ²°
System.out.println("κ°μ μΆκ°: " + a + " β " + b);
}
// μμ μ μ μ λ¨Όμ λ°©λ¬ΈνκΈ° μν μ λ ¬
for (int i = 1; i <= N; i++) {
Collections.sort(adj[i]);
}
// μ 체 κ·Έλν ꡬ쑰 νμΈ μΆλ ₯
System.out.println("μ λ ¬λ μΈμ 리μ€νΈ:");
for (int i = 1; i <= N; i++) {
System.out.println(" " + i + " β " + adj[i]);
}
System.out.println();
// DFS μΆλ ₯
// DFSμ BFSλ μλ‘ μν₯μ μ£Όμ§ μλλ‘ visited κ°κ° μ΄κΈ°ν
visited = new boolean[N + 1];
System.out.println("===== DFS μμ =====");
dfs(V);
System.out.println("\n===== DFS μ’
λ£ =====\n");
// BFS μΆλ ₯
visited = new boolean[N + 1]; // λ°©λ¬Έ λ°°μ΄ λ€μ μ΄κΈ°ν
System.out.println("===== BFS μμ =====");
bfs(V);
System.out.println("\n===== BFS μ’
λ£ =====");
}
// ===== DFS ν¨μ μ μ =====
// κΉμ΄ μ°μ νμ: κ°λ₯ν ν κΉκ² λ€μ΄κ°λ λ°©μ (μ¬κ·λ‘ ꡬν)
static void dfs(int v) {
visited[v] = true; // νμ¬ μ μ λ°©λ¬Έ μ²λ¦¬
System.out.println("[DFS] λ°©λ¬Έ β " + v);
// νμ¬ μ μ μ μ°κ²°λ μΈμ μ μ λ€μ μμλλ‘ νμΈ
for (int nxt : adj[v]) {
System.out.println(" [DFS] " + v + "μ μ΄μ μ²΄ν¬ β " + nxt);
// μμ§ λ°©λ¬Ένμ§ μμλ€λ©΄ μ¬κ· νΈμΆλ‘ κ³μ λ€μ΄κ°
if (!visited[nxt]) {
System.out.println(" [DFS] β " + nxt + " μ¬κ· νΈμΆ");
dfs(nxt);
} else {
System.out.println(" [DFS] μ΄λ―Έ λ°©λ¬Έν¨ β " + nxt);
}
}
}
// ===== BFS ν¨μ μ μ =====
// λλΉ μ°μ νμ: κ°κΉμ΄ λ
ΈλλΆν° νμνλ λ°©μ (νλ‘ κ΅¬ν)
static void bfs(int start) {
Queue<Integer> queue = new LinkedList<>(); // νμμ μ¬μ©ν ν
visited[start] = true; // μμ μ μ λ°©λ¬Έ μ²λ¦¬
queue.offer(start); // νμ μμ μ μ λ£κΈ°
System.out.println("[BFS] μμ μ μ β " + start);
// νκ° λΉ λκΉμ§ λ°λ³΅
while (!queue.isEmpty()) {
// νμμ κΊΌλ΄λ©΄μ νμ¬ νμν μ μ μ ν
int v = queue.poll();
System.out.println("[BFS] poll()λ‘ νμμ μ κ±° β " + v);
// νμ¬ μ μ κ³Ό μ°κ²°λ λͺ¨λ μ΄μ μ μ νμΈ
for (int nxt : adj[v]) {
System.out.println(" [BFS] " + v + "μ μ΄μ μ²΄ν¬ β " + nxt);
// μμ§ λ°©λ¬Ένμ§ μμ μ μ μ΄λ©΄ νμ μΆκ°
if (!visited[nxt]) {
visited[nxt] = true;
queue.offer(nxt);
System.out.println(" [BFS] νμ μΆκ° β " + nxt);
} else {
System.out.println(" [BFS] μ΄λ―Έ λ°©λ¬Έν¨ β " + nxt);
}
}
}
}
}
πͺ λλ²κΉ μ½λ μ€ν κ²°κ³Ό
5 5 3
N=5, M=5, V=3
5 4
κ°μ μΆκ°: 5 β 4
5 2
κ°μ μΆκ°: 5 β 2
1 2
κ°μ μΆκ°: 1 β 2
3 4
κ°μ μΆκ°: 3 β 4
3 1
κ°μ μΆκ°: 3 β 1
μ λ ¬λ μΈμ 리μ€νΈ:
1 β [2, 3]
2 β [1, 5]
3 β [1, 4]
4 β [3, 5]
5 β [2, 4]
===== DFS μμ =====
[DFS] λ°©λ¬Έ β 3
[DFS] 3μ μ΄μ μ²΄ν¬ β 1
[DFS] β 1 μ¬κ· νΈμΆ
[DFS] λ°©λ¬Έ β 1
[DFS] 1μ μ΄μ μ²΄ν¬ β 2
[DFS] β 2 μ¬κ· νΈμΆ
[DFS] λ°©λ¬Έ β 2
[DFS] 2μ μ΄μ μ²΄ν¬ β 1
[DFS] μ΄λ―Έ λ°©λ¬Έν¨ β 1
[DFS] 2μ μ΄μ μ²΄ν¬ β 5
[DFS] β 5 μ¬κ· νΈμΆ
[DFS] λ°©λ¬Έ β 5
[DFS] 5μ μ΄μ μ²΄ν¬ β 2
[DFS] μ΄λ―Έ λ°©λ¬Έν¨ β 2
[DFS] 5μ μ΄μ μ²΄ν¬ β 4
[DFS] β 4 μ¬κ· νΈμΆ
[DFS] λ°©λ¬Έ β 4
[DFS] 4μ μ΄μ μ²΄ν¬ β 3
[DFS] μ΄λ―Έ λ°©λ¬Έν¨ β 3
[DFS] 4μ μ΄μ μ²΄ν¬ β 5
[DFS] μ΄λ―Έ λ°©λ¬Έν¨ β 5
[DFS] 1μ μ΄μ μ²΄ν¬ β 3
[DFS] μ΄λ―Έ λ°©λ¬Έν¨ β 3
[DFS] 3μ μ΄μ μ²΄ν¬ β 4
[DFS] μ΄λ―Έ λ°©λ¬Έν¨ β 4
===== DFS μ’
λ£ =====
===== BFS μμ =====
[BFS] μμ μ μ β 3
[BFS] poll()λ‘ νμμ μ κ±° β 3
[BFS] 3μ μ΄μ μ²΄ν¬ β 1
[BFS] νμ μΆκ° β 1
[BFS] 3μ μ΄μ μ²΄ν¬ β 4
[BFS] νμ μΆκ° β 4
[BFS] poll()λ‘ νμμ μ κ±° β 1
[BFS] 1μ μ΄μ μ²΄ν¬ β 2
[BFS] νμ μΆκ° β 2
[BFS] 1μ μ΄μ μ²΄ν¬ β 3
[BFS] μ΄λ―Έ λ°©λ¬Έν¨ β 3
[BFS] poll()λ‘ νμμ μ κ±° β 4
[BFS] 4μ μ΄μ μ²΄ν¬ β 3
[BFS] μ΄λ―Έ λ°©λ¬Έν¨ β 3
[BFS] 4μ μ΄μ μ²΄ν¬ β 5
[BFS] νμ μΆκ° β 5
[BFS] poll()λ‘ νμμ μ κ±° β 2
[BFS] 2μ μ΄μ μ²΄ν¬ β 1
[BFS] μ΄λ―Έ λ°©λ¬Έν¨ β 1
[BFS] 2μ μ΄μ μ²΄ν¬ β 5
[BFS] μ΄λ―Έ λ°©λ¬Έν¨ β 5
[BFS] poll()λ‘ νμμ μ κ±° β 5
[BFS] 5μ μ΄μ μ²΄ν¬ β 2
[BFS] μ΄λ―Έ λ°©λ¬Έν¨ β 2
[BFS] 5μ μ΄μ μ²΄ν¬ β 4
[BFS] μ΄λ―Έ λ°©λ¬Έν¨ β 4
===== BFS μ’
λ£ =====
β± μκ° λ³΅μ‘λ
-
μ λ ₯ μ²λ¦¬:
M
κ°μ κ°μ μ μ½κ³ μΈμ 리μ€νΈ(adj
)μ μΆκ° βO(M)
-
μ λ ¬:
κ° μ μ μ λν΄ μ λ ¬Collections.sort()
μν βO(N * log D)
(μ¬κΈ°μ Dλ κ° μ μ μ νκ· μΈμ μ μ μ, μ΅μ μ κ²½μ° D = N) β μ΅μ :O(N log N)
(μ μ λ§λ€ μ°κ²°λ μ μ μ΄ λ§μ κ²½μ°) -
DFS (κΉμ΄ μ°μ νμ): κ° μ μ μ νλ²μ© λ°©λ¬Ένλ©° μΈμ μ μ νμ β
O(N + M)
-
BFS (λλΉ μ°μ νμ): βνλ₯Ό μ΄μ©ν΄μβ κ° μ μ μ νλ²μ© λ°©λ¬Ένλ©° μΈμ μ μ νμ β
O(N + M)
-
μΆλ ₯:
System.out.print()
μ ν΅ν μμ°¨ μΆλ ₯ βO(N)
(μ΅λ Nκ° μ μ λ°©λ¬Έ)
π μ΄ μκ° λ³΅μ‘λ:
O(M + N log N)
βοΈ λλ μ
- λλ²κΉ μ½λλ‘ μ²λ¦¬κ³Όμ μ λͺ¨λ λ¨κ³ νΊμ보λκ² μ΄ν΄μ λ§μ λμμ΄ λλ€.
- BFSλ μ΅λ¨ κ²½λ‘λ§ μ¬μ©νλ―λ‘ μ¬μ©νμ§ μλ κ°μ μ΄ μλ€.