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