본문 바로가기

PS

백준 BOJ 1260 C++ [DFS와 BFS]

#include <bits/stdc++.h>
using namespace std;

int n, m, v;

vector<int> adj[1001];  // 인접 리스트
bool visited[1001];

void dfs(int node) {
    visited[node] = true;
    cout << node << ' ';
    for (auto next_node : adj[node]) {  // 선택한 노드의 인접 노드를 탐색
        if (!visited[next_node]) {  // 인접 노드에 아직 방문하지 않았다면
            dfs(next_node);  // 그 노드로 깊이 파고 듦
        }
    }
}

void bfs(int node) {
    queue<int> q;
    visited[node] = true;
    cout << node << ' ';
    q.push(node);
    while (!q.empty()) {
        node = q.front();
        q.pop();
        for (auto next_node : adj[node]) {
            if (!visited[next_node]) {
                visited[next_node] = true;
                cout << next_node << ' ';
                q.push(next_node);
            }
        }
    }
}

void solve() {
    cin >> n >> m >> v;
    for (int i = 0; i < m; ++i) {  // 간선 정보를 통해 인접 리스트 구성
        int a, b;
        cin >> a >> b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    // 번호가 낮은 순으로 방문하기 위해 정렬
    for (int i = 1; i <= n; ++i) {
        sort(adj[i].begin(), adj[i].end());
    }
    dfs(v);
    cout << '\n';
    memset(visited, false, sizeof(visited));  // bfs 호출 전 visited 배열 초기화
    bfs(v);
    cout << '\n';
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    solve();
    return 0;
}