์ ๋ ฅ: N(์ ์ ์ ๊ฐ์), M(๊ฐ์ ์ ๊ฐ์), V(์ฒ์ ๋ฐฉ๋ฌธํ ๋ฒํธ), ์๋ก ์ฐ๊ฒฐ๋ ๋ฒํธ์
์ถ๋ ฅ: DFS ๋ฐฉ๋ฌธ ์์, BFS ๋ฐฉ๋ฌธ ์์
#include <bits/stdc++.h>
using namespace std;
void DFS(int start, deque<int> *graph, bool *check, deque<int> *DFS_result){
stack<int> s;
check[start] = true;
s.push(start);
(*DFS_result).push_back(start);
while(!s.empty()){
int current = s.top();
s.pop();
for(int next: graph[current]){
if(check[next] == false){
s.push(current);
s.push(next);
check[next] = true;
(*DFS_result).push_back(next);
break;
}
}
}
}
void BFS(int start, deque<int> *graph, bool *check, deque<int> *BFS_result){
queue<int> q;
check[start] = true;
q.push(start);
while(!q.empty()){
int front = q.front();
(*BFS_result).push_back(front);
q.pop();
for(int num: graph[front]){
if(check[num] == false){
q.push(num);
check[num] = true;
}
}
}
}
int main(){
int N, M, V; //N: ์ ์ ์ ์, M: ๊ฐ์ ์ ์, V: ์์ํ ์ ์ ์ ๋ฒํธ
scanf("%d %d %d", &N, &M, &V);
deque<int> graph[N];
deque<int> DFS_result;
deque<int> BFS_result;
bool DFS_check[N];
bool BFS_check[N];
fill(DFS_check, DFS_check+N, false);
fill(BFS_check, BFS_check+N, false);
for(int i=0; i<M; i++){
int u,v;
scanf("%d %d", &u, &v);
graph[u-1].push_back(v-1);
graph[v-1].push_back(u-1);
}
for(int i=0; i<N; i++) sort(graph[i].begin(), graph[i].end());
DFS(V-1, graph, DFS_check, &DFS_result);
BFS(V-1, graph, BFS_check, &BFS_result);
for(int i: DFS_result) printf("%d ", i+1);
printf("\n");
for(int i: BFS_result) printf("%d ", i+1);
}
#include <iostream>
#include <stdio.h>
#include <deque>
#include <queue>
#include <algorithm>
#include <stack>
using namespace std;
void DFS(int start, deque<int> *graph, bool *check, deque<int> *DFS_result){
stack<int> s;
check[start] = true;
s.push(start);
printf("[+] %d VISITED\n", start);
while(!s.empty()){
int front = s.top();
s.pop(); printf("[+] POPED %d\n", front);
(*DFS_result).push_back(front);
for(int num: graph[front]){
if(check[num] == false){
s.push(num);
check[num] = true;
printf("[+] %d VISITED\n", num);
}
}
}
}
void BFS(int start, deque<int> *graph, bool *check, deque<int> *BFS_result){
queue<int> q;
check[start] = true;
q.push(start);
printf("[+] %d VISITED\n", start);
while(!q.empty()){
int front = q.front(); printf("[+] POPED %d\n", front);
(*BFS_result).push_back(front);
q.pop();
for(int num: graph[front]){
if(check[num] == false){
q.push(num);
check[num] = true;
printf("[+] %d VISITED\n", num);
}
}
}
}
int main(){
int N, M, V; //N: ์ ์ ์ ์, M: ๊ฐ์ ์ ์, V: ์์ํ ์ ์ ์ ๋ฒํธ
scanf("%d %d %d", &N, &M, &V);
deque<int> graph[N];
deque<int> DFS_result;
deque<int> BFS_result;
bool DFS_check[N];
bool BFS_check[N];
fill(DFS_check, DFS_check+N, false);
fill(BFS_check, BFS_check+N, false);
for(int i=0; i<M; i++){
int u,v;
scanf("%d %d", &u, &v);
graph[u-1].push_back(v-1);
graph[v-1].push_back(u-1);
}
for(int i=0; i<N; i++) sort(graph[i].begin(), graph[i].end());
DFS(V-1, graph, DFS_check, &DFS_result);
BFS(V-1, graph, BFS_check, &BFS_result);
printf("RESULT OF DFS: ");
for(int i: DFS_result) printf("%d ", i);
printf("\nRESULT OF BFS: ");
for(int i: BFS_result) printf("%d ", i);
}
๋ฐฑ์ค 2606: ๋ฐ์ด๋ฌ์ค ๋ฌธ์ ์์ recursive๋ก ๊ตฌํํ์ด์, ์ด๋ฒ์๋ stack์ผ๋ก ๊ตฌํํด๋ดค๋ค.
stack์ ๊ฒฝ์ฐ, top์์๋ง ๋ฃ๊ณ ๊บผ๋ผ ์ ์์ผ๋ฏ๋ก ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ฃ์ ์์๋ถํฐ popํ ์ ์๋ค.
์ฒ์ ์์ํ๋ ๋ฒํธ๋ถํฐ ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ ํด์ฃผ๊ณ , stack์ ๋ฃ๋๋ค. ๋ค์ ์ด ์์๋ฅผ pop์ ํด์ ํด๋น ๋ฒํธ์ ์ฐ๊ฒฐ๋ ์์๋ค๋ฅผ stack์ ๋ฃ๋๋ค.
์ด๋ฏธ ๋ฐฉ๋ฌธํ ์์๋ stack์ ๋ฃ์ง ์๋๋ค.
์ฒซ ๋ฒ์งธ ์์์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ์์๋ ๋ฐฉ๋ฌธํด์ผ ํ๋ฏ๋ก, ๋ค์ ์ฒซ ๋ฒ์งธ ์์๋ฅผ stack์ ๋ฃ์ ํ, ๋ฐฉ๋ฌธํ ์ฒซ ๋ฒ์งธ ์์์ ์ฐ๊ฒฐ๋ ์์๋ฅผ stack์ ๋ฃ๋๋ค.
๋ค์์ผ๋ก๋ top์ ์๋ ์๊น ๋ฃ์๋ ์์๋ฅผ popํ ํ, top์ ์์๋ฅผ stack์ ๋ฃ์ ํ ์ด top ์์์ ์ฐ๊ฒฐ๋ ์์๋ฅผ stack์ ๋ฃ๋๋ค.
์์ ๊ณผ์ ์ stack์ด empty๊ฐ ๋ ๋๊น์ง ๋ฐ๋ณตํ ํ ์ข ๋ฃ๋๋ค.
stack์์ popํ ์์๊ฐ DFS์์์ ๋ฐฉ๋ฌธ์์์ด๋ค.
queue๋ก ๊ตฌํ (FIFO)
queue์ ๊ฒฝ์ฐ, front๋ฅผ popํ๊ณ front์ ์ฐ๊ฒฐ๋ ์์์ queue ๋ค์ ์ฐจ๋ก๋ก ๋ฃ๋ ๊ณผ์ ์ empty๊ฐ ์๋ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
์ด๋ฏธ ๋ฐฉ๋ฌธํ ์์๋ queue์ ๋ฃ์ง ์๋๋ค.
queue์์ ์์๋ฅผ ๋นผ๋ ์์๊ฐ ๋ฐฉ๋ฌธ ์์์ด๋ค.
์ฒ์ ๋ฐฉ๋ฌธํ๋ ๋ฒํธ๋ 0๋ถํฐ ์์ํ๋ฏ๋ก V-1๋ก ์คฌ๋ค.
[ํ๋ก๊ทธ๋๋จธ์ค] ํ๊ฒ ๋๋ฒ (DFS/BFS, C++) (0) | 2021.02.02 |
---|---|
[๋ฐฑ์ค(BOJ)] 1620๋ฒ: ๋๋์ผ ํฌ์ผ๋ชฌ ๋ง์คํฐ ์ด๋ค์ (Hash, C++) (0) | 2021.01.29 |
[๋ฐฑ์ค(BOJ)] 3273๋ฒ: ๋ ์์ ํฉ (Two Pointers Algorithm, C++) (0) | 2021.01.22 |
[๋ฐฑ์ค(BOJ)] 2606๋ฒ: ๋ฐ์ด๋ฌ์ค (DFS/BFS, C++) (0) | 2021.01.21 |
[๋ฐฑ์ค(BOJ)] 5585๋ฒ: ๊ฑฐ์ค๋ฆ๋ (๊ทธ๋ฆฌ๋(Greedy) ์๊ณ ๋ฆฌ์ฆ, C++) (0) | 2021.01.20 |