DFS & BFS ꡬν
λ€μ΄κ°λ©°
2020-1νκΈ°, λνμμ βμκ³ λ¦¬μ¦β μμ μ λ£κ³ 곡λΆν λ°λ₯Ό μ 리ν κΈμ λλ€. μ§μ μ μΈμ λ νμμ λλ€ :) μ 체 ν¬μ€νΈλ Algorithm ν¬μ€νΈμμ νμΈνμ€ μ μμ΅λλ€.
<DFS>, <BFS>μ λν κΈ°μ΄ λ°±μ€ λ¬Έμ μΈ 1260λ² - DFSμ BFS κΈ°μ€μΌλ‘ μ½λλ₯Ό μμ±ν΄λ³΄μλ€.
Set-up
μ λ κ·Έλνμ edge $E$λ₯Ό μ μ₯ν λ, βμΈμ 리μ€νΈ(Adjacency List)β λ°©μμ μ νΈ ν©λλ€. κ·Έλ¦¬κ³ λ°©λ¬Έ μ¬λΆλ bool νμ
μ λ°°μ΄ isVisit[]λ‘ κΈ°λ‘ ν©λλ€.
vector<int> edges[MAX];
bool isVisit[MAX];
κ·Έλ¦¬κ³ λ°μ΄ν°λ₯Ό λ£λ건 μλ κ²
for (int i = 0; i < M; i++) {
int s, e;
scanf("%d %d", &s, &e);
edges[s].push_back(e);
edges[e].push_back(s);
}
DFS
Recursion
void dfs(int v) {
printf("%d ", v);
isVisit[v] = true;
for (int i = 0; i < edges[v].size(); i++) {
int adj = edges[v][i];
if (!isVisit[adj]) {
dfs(adj);
}
}
}
Stack
void dfs_stack(int s) {
stack<int> st;
st.push(s);
while (!st.empty()) {
int top = st.top();
st.pop();
if(!isVisit[top]){
isVisit[top] = true;
printf("%d ", top);
for (int i = 0; i < edges[top].size(); i++) {
int adj = edges[top][i];
if (!isVisit[adj]) {
st.push(adj);
}
}
}
}
}
BFS
void bfs(int s) {
queue<int> q;
isVisit[s] = true;
q.push(s);
while (!q.empty()) {
int front = q.front();
printf("%d ", front, q.size());
q.pop();
for (int i = 0; i < edges[front].size(); i++) {
int adj = edges[front][i];
if (!isVisit[adj]) {
q.push(adj);
isVisit[adj] = true;
}
}
}
}
DFS-BFS νΈν μ½λ
λͺλ
κ°μ PS κ²½νμ λ°λ₯΄λ©΄, <DFS>μ ꡬν μ½λμ <BFS>μ ꡬν μ½λμ ννλ₯Ό κ±°μ μΌμΉμν¬ μ μλ ꡬν μ€νμΌμ΄ μμ΅λλ€. μ΄ μ€νμΌμ stackμ μ°λ©΄ DFSκ° λκ³ , queueλ₯Ό μ°λ©΄ BFSκ° λ©λλ€!
1. DFS (stack)
void dfs_stack(int s) {
stack<int> st; // stack μ¬μ©
st.push(s);
while (!st.empty()) {
int top = st.top();
st.pop();
if(!isVisit[top]){
isVisit[top] = true;
printf("%d ", top);
for (int i = 0; i < edges[top].size(); i++) {
int adj = edges[top][i];
if (!isVisit[adj]) {
st.push(adj);
}
}
}
}
}
2. BFS (queue)
void bfs_queue(int s) {
queue<int> q; // queueλ₯Ό μ¬μ!
q.push(s);
while (!q.empty()) {
int front = q.front();
q.pop();
if(!isVisit[front]){
isVisit[front] = true;
printf("%d ", front, q.size());
for (int i = 0; i < edges[front].size(); i++) {
int adj = edges[front][i];
if (!isVisit[adj]) {
q.push(adj);
}
}
}
}
}
μ½λλ₯Ό μ μ΄ν΄λ³΄λ©΄, Containerλ‘ stackμ μ ννλμ§, queueλ₯Ό μ ννλμ§μ λ°λΌ μκ³ λ¦¬μ¦μ΄ λ°λ건 λ³Ό μ μμ΅λλ€.
κ°μΈμ μΌλ‘ μμ£Ό μ°λ μ€νμΌμ μλλ°, <DFS>, <BFS> μ½λλ₯Ό μ¬λ¬ λ² κ΅¬νν΄λ³΄λ μ΄λ° ν¨ν΄λ 보μ΄κ² λμμ΅λλ€ γ γ π νμ§λ§ μ¬μ ν <DFS> ꡬνμ <μ¬κ· recursion>μΌλ‘ ꡬννλ κ±Έ μ νΈνλ κ² κ°μ΅λλ€ π