OJ 1260-DFSとBFS


Problem
https://www.acmicpc.net/problem/1260
グラフィックをDFSとBFSにナビゲートし、出力プログラムを作成します.
Solution

  • 頂点の数と頂点間の接続情報を入力します.

  • そしてDFSとBFSでナビゲーション結果を出力する.

  • アクセス可能な頂点は、2つ以上の一時的な小数点以下でアクセスできます.

  • グラフの実装は隣接テーブルで表される.
  • #include <bits/stdc++.h>
    using namespace std;
    
    void dfs(int x);
    void bfs(int x);
    
    vector<int> a[1001]; // 인접리스트
    bool check[1001];
    int v, e, s; // 정점 개수, 간선 개수, 시작점
    
    int main() {
        ios_base::sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);
    
        cin >> v >> e >> s;
    
        //정점들끼리의 정보를 입력받고 저장함.
        for (int i = 0; i < e; i++) {
            int n1, n2;
            cin >> n1 >> n2;
            a[n1].push_back(n2);
            a[n2].push_back(n1);
        }
    
        for (int i = 1; i <= v; i++) {
            sort(a[i].begin(), a[i].end()); //작은 숫자부터 방문하기 위해서
        }
    
        dfs(s); cout << '\n';
        memset(check, false, sizeof(check)); //check 배열 초기화
        bfs(s); cout << '\n';
        return 0;
    }
    
    //DFS
    void dfs(int x) {
        check[x] = true; //정점을 방문
        cout << x << ' '; // 정점 방문 출력
        for (int i = 0; i < a[x].size(); i++) {
            int next = a[x][i]; // 연결되어있는 정점 방문
            if (check[next] == false) //아직 방문하지 않은 점이라면 
                dfs(next); // 재귀로 방문
        }
    }
    
    //BFS
    void bfs(int x) {
        queue<int> q;
        check[x] = true; //정점을 방문
        q.push(x); // 방문한 점은 큐에 넣는다. (방문과 같은 의미)
    
        while (!q.empty()) {
            int node = q.front(); //q.front()가 현재 위치한 정점.
            q.pop();
            cout << node << ' ';
    
            for (int i = 0; i < a[node].size(); i++) {
                int next = a[node][i];
                if (check[next] == false) { //방문하지 않은 점이라면
                    check[next] = true; // 방문
                    q.push(next); // 그리고 큐에 넣기! (방문과 push는 동시에 이뤄짐)
                }
            }
        }
    }