알고리즘/문제 풀이

1260번: DFS와 BFS

Themion 2021. 12. 7. 23:40

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

 

1260번: DFS와 BFS

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

www.acmicpc.net

주어진 그래프를 각각 깊이 우선 탐색, 너비 우선 탐색을 하는 문제이다. 깊이 우선 탐색은 호출 스택을, 너비 우선 탐색은 STL을 이용해 계산하는 것이 편하다. 

#include <cstdio>
#include <queue>

using namespace std;

#define MAX_N 1000

// edge[i][j]: 노드 i와 j가 연결되어 있다면 true, 아니라면 false
// visit: dfs에선 각 노드를 방문했다면 true, bfs에선 각 노드를 방문했다면 false
bool edge[MAX_N + 1][MAX_N + 1], visit[MAX_N + 1];
// N: 노드의 개수, V: 탐색을 시작할 노드
int N, V;

// dfs를 재귀적으로 구현
void dfs(int node) {
    // 현재 노드를 출력한 뒤 현재 노드를 방문했음을 표시한다
    printf("%d ", node);
    visit[node] = true;

    // 현재 노드와 연결된 노드 중 방문하지 않은 노드를 방문한다
    for (int i = 1; i <= N; i++) if ((edge[node][i]) && (!visit[i])) dfs(i);
}

// bfs를 큐를 이용하여 구현
void bfs() {
    // 방문한 노드와 연결된 노드를 검색할 때 쓸 변수
    int node;
    // bfs에서 사용할 큐
    queue<int> q;

    // 시작 노드를 방문한 뒤 큐에 넣는다
    visit[V] = false;
    q.push(V);

    // 큐에 들어있는 노드에 대해
    while (!q.empty()) {
        node = q.front();
        q.pop();

        // 현재 노드를 출력
        printf("%d ", node);

        // 현재 노드와 연결된 노드 중 아직 방문하지 않은 노드에 대해
        for (int i = 1; i <= N; i++) if (edge[node][i] && visit[i]) {
            // 그 노드를 큐에 넣고 방문했음을 표시한다
            q.push(i);
            visit[i] = false;
        }
    }

    // 모든 노드를 방문했으므로 줄을 바꾼다
    printf("\n");
}

int main() {
    // M: 에지의 개수, a, b: 에지를 입력받을 때 사용할 공간
    int M, a, b;

    // 문제의 조건을 입력받는다
    scanf("%d %d %d", &N, &M, &V);
    while (M--) {
        scanf("%d %d", &a, &b);
        edge[a][b] = true;
        edge[b][a] = true;
    }

    // dfs와 bfs를 순차적으로 실행
    dfs(V);
    printf("\n");
    bfs();

    return 0;
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

1316번: 그룹 단어 체커  (0) 2021.12.08
1309번: 동물원  (0) 2021.12.07
1259번: 팰린드롬수  (0) 2021.12.07
1254번: 팰린드롬 만들기  (0) 2021.12.07
1238번: 파티  (0) 2021.12.07