반응형

문제 링크 : https://www.acmicpc.net/problem/1260

 

1260번: DFS와 BFS

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

www.acmicpc.net

> 풀이

dfs는 스택을, bfs는 큐를 사용합니다.

#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;

vector<int> node[1001];
vector<bool> dfs_visited(1001);
vector<bool> bfs_visited(1001);
stack<int> dfs;
queue<int> bfs;
int n, m, v;

int main(void) {        
        scanf("%d %d %d", &n, &m, &v);

        for (int i = 0; i < m; i++ ) {
                int a, b;
                scanf("%d %d", &a, &b);
                node[a].push_back(b);
                node[b].push_back(a);
        }
        for (int i = 0; i <= n; i++) {
                sort(node[i].begin(), node[i].end());
        }

        dfs.push(v);			//dfs 시작
        while (!dfs.empty()) {
                int num = dfs.top();

                if (dfs_visited[num] == true) {
                        dfs.pop();
                        continue;
                } else {
                        dfs.pop(), printf("%d ", num), dfs_visited[num] = true;
                }

                for (int i = node[num].size() - 1; i >= 0; i--) {
                        int u = node[num][i];

                        if (dfs_visited[u] == false) dfs.push(u);
                }
        } putchar('\n');

        bfs.push(v);			//bfs 시작
        while (!bfs.empty()) {
                int num = bfs.front();

                if (bfs_visited[num] == true) {
                        bfs.pop();
                        continue;
                } else {
                        bfs.pop(), printf("%d ", num), bfs_visited[num] = true;
                }

                for (int i = 0; i < node[num].size(); i++) {
                        int u = node[num][i];

                        if (bfs_visited[u] == false) bfs.push(u);
                }
        } putchar('\n');
        return 0;
}

(개발 환경 : vs code)

반응형

+ Recent posts