π‘λ¬Έμ λΆμ μμ½
- μ
λ ₯: 첫 λ²μ§Έ μ€μ μ μ μ κ°μ
N
, κ°μ μ κ°μ M
, μμν μ μ V
κ° μ£Όμ΄μ§λ€. μ΄ν M
κ°μ μ€μ λ μ μ μ¬μ΄μ κ°μ μ λ³΄κ° μ£Όμ΄μ§λ€. κ°μ μ μλ°©ν₯μ΄λ€.
- λͺ©ν: μμ μ μ
V
μμ DFSμ BFSλ₯Ό μνν κ²°κ³Όλ₯Ό κ°κ° μΆλ ₯ν΄μΌ νλ€.
- DFSλ μ¬κ·μ μΌλ‘ κΉμ΄ μ°μ νμμ νμ¬ λ°©λ¬Έν μ μλ λͺ¨λ μ μ μ νμνλ€.
- BFSλ νλ₯Ό μ¬μ©νμ¬ λλΉ μ°μ νμμ μννλ©°, μμμ μμ κ°κΉμ΄ μ μ λΆν° μ°¨λ‘λλ‘ νμνλ€.
π‘μκ³ λ¦¬μ¦ μ€κ³
- κ·Έλν νν
- κ·Έλνλ μΈμ 리μ€νΈ λ°©μμΌλ‘ νννλ€.
- κ° μ μ μ΄ λ€λ₯Έ μ μ κ³Ό μ°κ²°λ μ 보λ₯Ό λ°°μ΄μ μ μ₯νμ¬ κ΅¬ννλ€.
- μ£Όμ΄μ§ κ·Έλνκ° μλ°©ν₯μ΄λ―λ‘ κ° κ°μ μ λν΄ λ μ μ μ μλ‘ μ°κ²°ν΄ μ€λ€.
- μ λ ¬
- DFSμ BFS λͺ¨λ μ μ λ²νΈκ° μμ μμλλ‘ λ°©λ¬Έν΄μΌ νλ―λ‘ μΈμ 리μ€νΈμ μ μ₯λ μ μ λ€μ μ€λ¦μ°¨μμΌλ‘ μ λ ¬νλ€.
- DFS(Depth-First Search)
- μ¬κ· ν¨μλ₯Ό μ¬μ©νμ¬ κ΅¬ννλ€. μμ μ μ μμ μ°κ²°λ μ μ λ€μ νλμ© μ¬κ·μ μΌλ‘ νμνλ©°, μ΄λ―Έ λ°©λ¬Έν μ μ μ λ€μ λ°©λ¬Ένμ§ μλλ€.
- λ°©λ¬Έν λλ§λ€ κ²°κ³Όλ₯Ό κΈ°λ‘νκ³ μΆλ ₯νλ€.
- BFS(Breadth-First Search)
- νλ₯Ό μ¬μ©νμ¬ κ΅¬ννλ€.
- μμ μ μ μμ κ°κΉμ΄ μ μ λΆν° μ°¨λ‘λλ‘ νμνλ©°, νμ λ°©λ¬Έν μ μ μ λ£κ³ , μ΄λ―Έ λ°©λ¬Έν μ μ μ λ€μ νμ λ£μ§ μλλ€.
- BFS νμ μμλλ‘ κ²°κ³Όλ₯Ό κΈ°λ‘νκ³ μΆλ ₯νλ€.
π‘μ½λ
const fs = require('fs');
const path = require('path');
const input = fs.readFileSync(path.join(__dirname, 'input.txt')).toString().trim().split('\\n');
// μ
λ ₯ λ°κΈ°
const [N, M, V] = input[0].split(' ').map(Number);
const graph = Array.from({ length: N + 1 }, () => []); // μ μ μ κ°μλ§νΌ λ°°μ΄ μμ±
for (let i = 1; i <= M; i++) {
const [a, b] = input[i].split(' ').map(Number);
graph[a].push(b); // μλ°©ν₯ κ·Έλνμ΄λ―λ‘ μμͺ½μ μ°κ²°
graph[b].push(a);
}
// μ μ λ²νΈκ° μμ μμλλ‘ λ°©λ¬Έν΄μΌ νλ―λ‘ μ λ ¬
graph.forEach((adjList) => adjList.sort((a, b) => a - b));
// DFS ν¨μ (μ¬κ·μ λ°©μ)
const dfs = (start, visited) => {
visited[start] = true;
process.stdout.write(start + ' '); // νμ μμ μΆλ ₯
for (const neighbor of graph[start]) {
if (!visited[neighbor]) {
dfs(neighbor, visited);
}
}
};
// BFS ν¨μ (ν λ°©μ)
const bfs = (start) => {
const visited = Array(N + 1).fill(false);
const queue = [start];
visited[start] = true;
while (queue.length) {
const node = queue.shift(); // νμμ κΊΌλΈ λ
Έλλ₯Ό λ°©λ¬Έ
process.stdout.write(node + ' ');
for (const neighbor of graph[node]) {
if (!visited[neighbor]) {
visited[neighbor] = true;
queue.push(neighbor); // νμ μΈμ λ
Έλ μΆκ°
}
}
}
};
// DFS νμ
const visitedDFS = Array(N + 1).fill(false);
dfs(V, visitedDFS);
process.stdout.write('\\n');
// BFS νμ
bfs(V);
π‘μκ° λ³΅μ‘λ
- κ·Έλνμμμ νμμ μ μ μ Nκ³Ό κ°μ μ Mμ λΉλ‘νλ μκ°μ΄ κ±Έλ¦°λ€.
- DFS: λͺ¨λ μ μ μ λ°©λ¬Ένκ³ κ° μ μ μ μΈμ 리μ€νΈλ₯Ό μννλ―λ‘
O(N + M)
μ μκ° λ³΅μ‘λλ₯Ό κ°λλ€.
- BFS: λ§μ°¬κ°μ§λ‘ λͺ¨λ μ μ κ³Ό κ°μ μ μννλ―λ‘
O(N + M)
μ μκ° λ³΅μ‘λλ₯Ό κ°λλ€.
- λ μκ³ λ¦¬μ¦ λͺ¨λ μκ° λ³΅μ‘λλ
O(N + M)
μ΄λ€.