알고리즘

[백준/ DFS&BFS/ C++] 1260번 DFS와 BFS

데메즈 2022. 12. 28. 23:33
728x90
반응형

https://www.acmicpc.net/problem/1260

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

#include <bits/stdc++.h>

using namespace std;

int n, m, v;
vector<int> graph[1001];
bool visited_dfs[1001];
bool visited_bfs[1001];

void dfs(int x){
    // 현재 노드를 방문처리
    visited_dfs[x] = true;
    cout << x << ' ';
    // 현재 노드와 연결된 다른 노드를 재귀적으로 방문
    for(int i=0; i<graph[x].size(); i++){
        int y = graph[x][i];
        if(!visited_dfs[y]) dfs(y);
    }
}

void bfs(int start){
    queue<int> q;
    q.push(start);
    // 현재 노드를 방문처리
    visited_bfs[start] = true;
    // 큐가 빌 때까지 반복
    while(!q.empty()){
        // 큐에서 하나의 원소를 뽑아 출력
        int x = q.front();
        q.pop();
        cout << x << ' ';
        // 해당 원소와 연결된, 아직 방문하지 않은 원소들을 큐에 삽입
        for(int i=0; i<graph[x].size(); i++){
            int y = graph[x][i];
            if(!visited_bfs[y]){
                q.push(y);
                visited_bfs[y] = true;
            }
        }
    }
}

int main(void) {
    cin >> n >> m >> v;

    for(int i=0; i<m; i++){
        int x, y;
        cin >> x >> y;
        graph[x].push_back(y);
        graph[y].push_back(x);
    }

    for(int i=1; i<=n; i++){
        sort(graph[i].begin(), graph[i].end());
    }

    dfs(v);
    cout << endl;
    bfs(v);

    return 0;
}
728x90
반응형