- toc {:toc}
νμ΄
DFS/BFS μ λν μ΄ν΄λ₯Ό 묻λ λ¬Έμ μ΄λ€. κ·Έλνλ₯Ό νμ±ν΄μ£Όκ³ DFS/BFS λ₯Ό ꡬννλ€.
μ΄ λ, λ°©λ¬Έ κ°λ₯ν μ μ μ΄ μ¬λ¬ κ°μΈ κ²½μ°μλ μ μ λ²νΈκ° μμ κ²μ λ¨Όμ λ°©λ¬Ένλ€λ μ μ μ£Όμνλ€.
BFS μ DFS μ μλμ리λ₯Ό μκ°νλ©΄μ νμ΄νμ. μλ μ½λλ DFS λ₯Ό μ¬κ·μ μΌλ‘ νμ΄ν λ°©μμ΄λ€.
#include <bits/stdc++.h>
using namespace std;
vector<int> graph[1005];
vector<pair<int, int>> vec;
queue<int> q;
stack<int> st;
int visit[1005];
void dfs(int v){
visit[v] = 1;
cout << v << ' ';
for(auto link : graph[v]){
if(visit[link] == 0)
dfs(link);
}
}
void bfs(){
while(!q.empty()){
int v = q.front(); q.pop();
cout << v << ' ';
for(auto link : graph[v]){
if(visit[link] == 0){
q.push(link);
visit[link] = 1;
}
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int N, M, V, val1, val2;
cin >> N >> M >> V;
for(int i=0; i < M; i++){
cin >> val1 >> val2;
if(val1 < val2)
vec.push_back({val1, val2});
else
vec.push_back({val2, val1});
}
sort(vec.begin(), vec.end());
for(int i=0; i < vec.size(); i++){
val1 = vec[i].first;
val2 = vec[i].second;
// 무방ν₯ κ·Έλν
graph[val1].push_back(val2);
graph[val2].push_back(val1);
}
dfs(V);
cout << '\n';
fill(visit, visit+N+1, 0);
q.push(V);
visit[V] = 1;
bfs();
return 0;
}λ€μμ λ°©μμ DFS λ₯Ό μ€νμ μ¬μ©ν΄μ ꡬνν λ°©μμ΄λ€. μΌλ°μ μΈ λ°λν λ°°μ΄μμλ 4 λ°©ν₯μΌλ‘ μ΄λνλ©΄μ 쑰건μ λ°λΌ ν λ²μ© μ€νμ push ν΄μ£Όλ©΄ λμ§λ§, 무방ν₯ κ·Έλνμμλ break μ push λ₯Ό λ λ² ν΄μ€μΌλ‘μ¨ DFS λ₯Ό ꡬννλ€.
μ push λ₯Ό λ λ² ν΄μ€μΌ ν κΉ?
4 5 1
1 2
1 3
1 4
2 4
3 4
λ€μμ μ λ ₯μ μκ°ν΄λ³΄μ.
1 μ μμμΌλ‘ λ€μ΄κ°μ λ λ°©λ¬Έ κ°λ₯ν μ μ μ΄ μ¬λ¬ κ°μ΄κΈ° λλ¬Έμ λ²νΈκ° μμ κ²μ λ λ¨Όμ λ°©λ¬Έν΄μΌ νλ€.
- graph(1) μ λ€μ΄κ°μ λ 2, 3, 4 μ λ°©λ¬Έ κ°λ₯νλ―λ‘ 2 λ₯Ό push νκ³ break νλ€.
- μ΄ ν 2 κ° μ€νμμ pop() λμ΄ μΆλ ₯λκ³ 2 μ μ°κ²°λ λ Έλ 4 λ‘ μ΄λνκ² λλ€.
- 4 κ° μ€νμμ pop() λμ΄ 3 μΌλ‘ μ΄λνλ€. λ€μμ λ°©μμΌλ‘ μ§ννλ©΄ κΉμ΄ μ°μ λ°©μμΌλ‘ μ§ν κ°λ₯νλ€.
3 2 1
1 3
2 1
νμ§λ§, λ€μμ μ λ ₯μ μκ°ν΄λ³΄μ.
- 1 μ λ€μ΄κ°μ λ 2, 3 μ λ°©λ¬Έ κ°λ₯νκ³ , 2 λ₯Ό push νκ³ break νλ€.
- 2 μ λ€μ΄κ°μ λ 1 μ λ°©λ¬Έ κ°λ₯νμ§λ§ μ΄λ―Έ λ°©λ¬Έ νκΈ°μ λμ΄κ°λ€.
- DFS κ° λλλ€. (1, 2 λ§ μΆλ ₯)
μμ κ²½μ°μ²λΌ ν λ²λ§ push ν κ²½μ° λ€μ μ μ μ λ°©λ¬Έ κ°λ₯ν μ μ μμ λμΉλ μ μ μ΄ μ‘΄μ¬νκ² λλ€. λ°λΌμ, break νλ λμ λ€μ ν λ² λ€μ μ μ μ κ°μ§ μ μ μ push νλ©΄μ λμΉλ μ μ μ΄ μλλ‘ λ§λ λ€.
#include <bits/stdc++.h>
using namespace std;
vector<int> graph[1005];
vector<pair<int, int>> vec;
queue<int> q;
stack<int> st;
int visit[1005];
void dfs(){
int v = st.top();
cout << v << ' ';
while(!st.empty()){
v = st.top(); st.pop();
for(auto link : graph[v]){
if(visit[link] == 0){
visit[link] = 1;
cout << link << ' ';
st.push(v);
st.push(link);
break;
}
}
}
}
void bfs(){
while(!q.empty()){
int v = q.front(); q.pop();
cout << v << ' ';
for(auto link : graph[v]){
if(visit[link] == 0){
q.push(link);
visit[link] = 1;
}
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int N, M, V, val1, val2;
cin >> N >> M >> V;
for(int i=0; i < M; i++){
cin >> val1 >> val2;
if(val1 < val2)
vec.push_back({val1, val2});
else
vec.push_back({val2, val1});
}
sort(vec.begin(), vec.end());
for(int i=0; i < vec.size(); i++){
val1 = vec[i].first;
val2 = vec[i].second;
// 무방ν₯ κ·Έλν
graph[val1].push_back(val2);
graph[val2].push_back(val1);
}
st.push(V);
visit[V] = 1;
dfs();
cout << '\n';
fill(visit, visit+N+1, 0);
q.push(V);
visit[V] = 1;
bfs();
return 0;
}