DFS and BFS - code
2020-1νκΈ°, λνμμ βμκ³ λ¦¬μ¦β μμ μ λ£κ³ 곡λΆν λ°λ₯Ό μ 리ν κΈμ λλ€. μ§μ μ μΈμ λ νμμ λλ€ :)
<DFS>, <BFS>μ λν κΈ°μ΄ λ°±μ€ λ¬Έμ μΈ 1260λ² - DFSμ BFS κΈ°μ€μΌλ‘ μ½λλ₯Ό μμ±ν΄λ³΄μλ€.
Set-up
κΈ°λ³Έμ μΌλ‘ λ³ΈμΈμ <edge>λ₯Ό μ μ₯ν λ, <μΈμ 리μ€νΈ Adjacency List> ννλ₯Ό μ¬μ©νλ€. κ·Έλ¦¬κ³ λ°©λ¬Έ μ¬λΆλ bool
νμ
μ λ°°μ΄λ‘ κΈ°λ‘νλ€.
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 (recurrsion)
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);
}
}
}
DFS (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 (queue)
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
μ queue
λ‘ λ°κΎΈλ©΄ <DFS>μμ <BFS>κ° λκ³ , κ·Έ λ°λλ‘ λ³ννλ©΄, <BFS>μμ <DFS>κ° λλ€!!
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>μΌλ‘ ꡬννλ κ±Έ μ νΈνλ κ² κ°λ€ π