• 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;
}