https://www.acmicpc.net/problem/1260
문제
- 그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 
- 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 
입력
- 첫째 줄에 정점의 개수 N(1≤N≤1,000), 간선의 개수 M(1≤M≤10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 
- 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 
- 한 간선이 여러 번 주어질 수도 있는데, 간선이 하나만 있는 것으로 생각하면 된다. 입력으로 주어지는 간선은 양방향이다. 
출력
- 첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. 
- V부터 방문된 점을 순서대로 출력하면 된다. 
접근
- 벡터로 인접리스트를 생성한다. 
- BFS와 DFS로 구현한다. 
- 방문할 수 있는 정점이 여러개인 경우, 정점 번호가 낮은 것 부터 방문해야 한다. - 큐를 활용하는 BFS는 방문할 수 있는 정점을 오름차순으로 정렬하여 번호가 가장 낮은 정점이 front에 위치하도록 한다. 
- 스택을 활용하는 DFS는 방문할 수 있는 정점을 내림차순으로 정렬하여 번호가 가장 낮은 정점이 top에 위치하도록 한다. 
 
C++ Code
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <functional>
using namespace std;
vector<vector<int>> adj;
vector<bool> visited;
int n, m, v;
int a, b;
void bfs(int v) {
    queue<int> q;
    q.push(v);
    while (!q.empty()) {
        int front = q.front();
        q.pop();
        if (visited[front]) continue;
        visited[front] = true;
        printf("%d ", front);
        sort(adj[front].begin(), adj[front].end());
        for (int i = 0; i < adj[front].size(); i++) {
            q.push(adj[front][i]);
        }
    }
    printf("\n");
}
void dfs(int v) {
    stack<int> s;
    s.push(v);
    while (!s.empty()) {
        int top = s.top();
        s.pop();
        if (visited[top]) continue;
        visited[top] = true;
        printf("%d ", top);
        sort(adj[top].begin(), adj[top].end(), greater<int>());
        for (int i = 0; i < adj[top].size(); i++) {
            if (!visited[adj[top][i]]) s.push(adj[top][i]);
        }
    }
    printf("\n");
}
int main(void) {
    scanf("%d %d %d", &n, &m, &v);
    adj.resize(n + 1);
    visited.resize(n + 1);
    for (int i = 0; i < m; i++) {
        scanf("%d %d", &a, &b);
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    dfs(v);
    fill_n(visited.begin(), n + 1, false);
    bfs(v);
    return 0;
}'아카이빙 > BOJ' 카테고리의 다른 글
| 백준 1992번 - 쿼드트리 (2) | 2017.09.01 | 
|---|---|
| 백준 1629번 - 곱셈 (0) | 2017.09.01 | 
| 백준 2468번 - 안전 영역 (0) | 2017.08.13 | 
| 백준 1697번 - 숨바꼭질 (0) | 2017.08.13 | 
| 백준 1600번 - 말이 되고픈 원숭이 (1) | 2017.08.13 |