κΉμ΄μ°μ νμ(DFS)
κΉμ΄μ°μ νμ(DFS)μ΄λ?
< κΉμ΄μ°μ νμ(DFS) κ³Όμ >
- κ·Έλνμμ ν λ°©ν₯μΌλ‘ κ°λ₯ν κΉμ΄κΉμ§ κ³μ νμ -> λ μ΄μ κ° μ μμΌλ©΄ λ€μ λμμμ λ€λ₯Έ λ°©ν₯μ νμνλ λ°©μμ κ·Έλν μν μκ³ λ¦¬μ¦μ λλ€.
- μ€ν(Stack) μλ£κ΅¬μ‘°μ λμ μ리(LIFO)λ₯Ό λ°λ¦ λλ€. -> μ¬κ· ν¨μ λλ λͺ μμ μ€νμΌλ‘λ ꡬν κ°λ₯
- μλ μ½λ(Pseudo Code)
u: νμ¬ νμ μ€μΈ μ μ
v: uμ μΈμ ν μ μ
adj[u]: μ μ uμ μΈμ ν λͺ¨λ μ μ λ€μ 리μ€νΈ
visited: κ° μ μ μ λ°©λ¬Έ μ¬λΆλ₯Ό κΈ°λ‘νλ λ°°μ΄ λλ μ§ν©
DFS(u):
visited[u] ← true // μμ μ μ u λ°©λ¬Έ νμ
u μ²λ¦¬ // μ μ u μ²λ¦¬ (μ: μΆλ ₯, κ²°κ³Ό μ μ₯ λ±)
for each v in adj[u]: // uμ λͺ¨λ μΈμ μ μ vμ λν΄
if not visited[v]: // vλ₯Ό μμ§ λ°©λ¬Ένμ§ μμλ€λ©΄
DFS(v) // vμ λν΄ DFS μ¬κ· νΈμΆ
κΉμ΄μ°μ νμ ꡬν λ°©λ²
1. μ¬κ·ν¨μ νΈμΆ μ , λ°©λ¬Έμ¬λΆ νμΈ
const int N = 4;
int visited[N];
vector<int> adj[N];
void dfs(int u) {
visited[u] = true;
for (int v: adj[u]) {
if(visited[v]) continue; // μΈμ μ μ λ°©λ¬Έμ¬λΆ νμΈ
dfs(v);
}
}
2. μ¬κ·ν¨μ νΈμΆ ν, λ°©λ¬Έμ¬λΆ νμΈ
const int N = 4;
int visited[N];
vector<int> adj[N];
void dfs(int u) {
if (visited[u]) // μμ μ μ λ°©λ¬Έμ¬λΆ νμΈ
return;
visited[u] = true;
for (int v: adj[u]) {
dfs(v);
}
}
λ¬Έμ μ λ°λΌ κ°κ°μ ꡬν λ°©λ²μ΄ μ μ©ν λκ° μμΌλ―λ‘ 2κ°μ§ μ½λ λͺ¨λ μ΄ν΄νκ³ κ΅¬ννλ κ²μ΄ μ€μν©λλ€.
κΉμ΄μ°μ νμμ νΉμ§
νλͺ© | μ€λͺ |
---|---|
μκ°λ³΅μ‘λ | \(O(V + E)\) (μ μ + κ°μ κ°μ) |
μλ£κ΅¬μ‘° | μ€ν (λλ μ¬κ· νΈμΆ μ€ν) |
μ¬μ© μμ | λ―Έλ‘ μ°ΎκΈ°, λ°±νΈλνΉ λ¬Έμ , μ¬μ΄ν΄ κ²μΆ, μμ μ λ ¬ λ± |
ꡬν λ°©μ | μ¬κ· ν¨μ λλ λͺ μμ μ€ν μ¬μ© |
β οΈ μ£Όμν μ
- 무ν 루ν λ°©μ§λ₯Ό μν΄ visited 체ν¬λ κΌ νμν©λλ€.
- λ°©ν₯ κ·ΈλνμΌ κ²½μ° λ°©ν₯μ λ§κ²λ§ νμν΄μΌ ν©λλ€.
- μ°κ²°λμ§ μμ κ·Έλνμ λͺ¨λ μ μ μ νμνλ €λ©΄ λ°λ³΅λ¬ΈμΌλ‘ λͺ¨λ μ μ μμ DFS μνμ΄ νμν©λλ€.
κΉμ΄μ°μ νμ μμ
1. λ―Έλ‘νμΆ
- μ€λͺ
- N × M ν¬κΈ°μ λ―Έλ‘μμ μΆλ°μ μμ λμ°©μ κΉμ§ κ° μ μλμ§ νλ³νλ λ¬Έμ
- μ΄λμ μνμ’μ° μΈμ ν μΉΈμΌλ‘λ§ κ°λ₯νλ©°, μ΄λν μ μλ μΉΈμ 1λ‘ νμλμ΄ μμ΅λλ€. λν, λ²½μ 0μΌλ‘ νμλμ΄ μμ΅λλ€.
- μΆλ°μ (0, 0)μμ λμ°©μ (N-1, M-1)κΉμ§ λλ¬ κ°λ₯νλ©΄ 'λμ°© κ°λ₯', λΆκ°λ₯νλ€λ©΄ 'λμ°© λΆκ°λ₯' μΆλ ₯
- μ λ ₯ μμ
5 6
1 0 1 0 1 0
1 1 1 1 1 0
0 0 0 0 1 0
1 1 1 0 1 0
0 0 1 1 1 1
- μΆλ ₯ μμ
λμ°© κ°λ₯
- μμ΄λμ΄
- 1μ μ΄λ κ°λ₯ν μΉΈ, 0μ λ²½
- DFSλ‘ (0, 0)μμ μμν΄μ (N-1, M-1)μ λλ¬ν μ μλμ§ νμΈ
- μνμ’μ° λ°©ν₯μΌλ‘ μ΄λνλ©° λ°©λ¬Έ 체ν¬
- μ λ΅ μ½λ
#include <bits/stdc++.h>
using namespace std;
const int N = 5, M = 6;
int maze[N][M] = {
{1, 0, 1, 0, 1, 0},
{1, 1, 1, 1, 1, 0},
{0, 0, 0, 0, 1, 0},
{1, 1, 1, 0, 1, 0},
{0, 0, 1, 1, 1, 1}
};
bool visited[N][M];
int dx[] = {-1, 1, 0, 0}; // μνμ’μ°
int dy[] = {0, 0, -1, 1};
bool dfs(int x, int y) {
if (x < 0 || y < 0 || x >= N || y >= M) return false;
if (maze[x][y] == 0 || visited[x][y]) return false;
visited[x][y] = true;
if (x == N - 1 && y == M - 1) return true;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (dfs(nx, ny)) return true;
}
return false;
}
int main() {
if (dfs(0, 0)) cout << "λμ°© κ°λ₯" << "\n";
else cout << "λμ°© λΆκ°λ₯" << "\n";
return 0;
}
2. μ°κ²° μμμ κ°μ ꡬνκΈ°
- μ€λͺ
- 무방ν₯ κ·Έλνκ° μ£Όμ΄μ‘μ λ, κ·Έλνμ μ°κ²° μμκ° λͺ κ°μΈμ§ μΆλ ₯νλ λ¬Έμ
- μ
λ ₯ μμ
- 첫 μ€μλ μ μ μ κ°μ(N)μ κ°μ μ κ°μ(M)μ΄ μ£Όμ΄μ§λλ€.
- λλ²μ§Έ μ€λΆν° λ κ°μ μ°κ²°λ μ μ μ΄ κ°κ° μ£Όμ΄μ§λλ€.
6 5
1 2
2 5
5 1
3 4
4 6
- μΆλ ₯ μμ
2
- μμ΄λμ΄
- DFSλ‘ λ°©λ¬Έ κ°λ₯ν λͺ¨λ λ Έλλ₯Ό μν
- λ°©λ¬Ένμ§ μμ λ Έλμμ DFSλ₯Ό μλ‘ μμνλ©΄ μ°κ²° μμ +1
- μ λ΅ μ½λ
#include <bits/stdc++.h>
using namespace std;
const int MAX = 1001;
vector<int> adj[MAX];
bool visited[MAX];
int N = 6, M = 5;
void dfs(int u) {
visited[u] = true;
for (int v : adj[u]) {
if (!visited[v])
dfs(v);
}
}
int main() {
vector<pair<int, int>> edges = {
{1, 2}, {2, 5}, {5, 1}, {3, 4}, {4, 6}
};
for (auto [u, v] : edges) {
adj[u].push_back(v);
adj[v].push_back(u); // 무방ν₯ κ·Έλν
}
int components = 0;
for (int i = 1; i <= N; i++) {
if (!visited[i]) {
dfs(i);
components++;
}
}
cout << "μ°κ²° μμ κ°μ: " << components << "\n";
return 0;
}
λ§λ¬΄λ¦¬νλ©°
- μ§κΈκΉμ§ DFS κ°λ μ λν΄ μμ보며 DFSλ ν μ μ μμ μμν΄ κ°λ₯ν ν κΉμ΄ λ€μ΄κ°λ€κ° λ μ΄μ κ° κ³³μ΄ μμΌλ©΄ λλμμ€λ λ°©μμΌλ‘ λμνλ€λ μ μ μ΄ν΄νμ΅λλ€.
- μ¬κ· νΈμΆ λλ μ€νμ μ΄μ©ν΄ ꡬνν μ μμΌλ©° μ΄λ₯Ό ν΅ν΄ κ·Έλν λ΄μ μ°κ²°μ± νμΈ, κ²½λ‘ νμ, μ¬μ΄ν΄ μ¬λΆ νλ¨ λ± λ€μν λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΅λλ€.
- DFSλ₯Ό νμ€ν μ΄ν΄νλ©΄ μ΄ν λ°°μ°κ² λ BFS(λλΉ μ°μ νμ), μμ μ λ ¬, νΈλ¦¬ νμ, κ°ν μ°κ²° μμ λ±μ κ°λ λ μ½κ² μ΄ν΄ν μ μμ΅λλ€.
- λ€μ κΈμμλ DFSμ μμ μ΄λ£¨λ BFS(λλΉ μ°μ νμ)μ λν΄ λ€λ€λ³Ό μμ μ λλ€.