[C++/백준] 1260 : DFS와

문제

DFS와 BFS를 사용하여 그래프를 검색한 결과를 반환하는 프로그램을 작성하세요. 그러나 여러 정점을 방문할 수 있는 경우 정점 번호가 작은 정점을 먼저 방문하고 더 이상 방문할 정점이 없으면 프로세스를 종료합니다.

정점 번호의 범위는 1에서 N까지입니다.

기입

노드의 수 N(1 ≤ N ≤ 1,000), 간선의 수 M(1 ≤ M ≤ 10,000), 검색을 시작할 노드의 수 V가 첫 번째 줄에 주어집니다.

다음 M 행은 가장자리가 연결되는 두 정점의 번호를 가져옵니다.

두 노드 사이에 여러 에지가 있을 수 있습니다.

입력으로 주어진 에지는 양방향입니다.

누르다

DFS 수행 결과는 첫 번째 행에 인쇄되고 BFS 수행 결과는 다음 행에 인쇄됩니다.

V로 시작하는 방문 지점이 순서대로 표시됩니다.


백준실버2 / dfs and bfs

항상 개념은 알고 있었지만 제대로 문제를 풀 수 있었던 것은 처음이었습니다.

놀랍게도 한시간동안 삽질을 했습니다.

.^^ (날 욕하지마, 그래)

하지만 아무리 열심히 삽질해도 내 뇌리에 단단히 박혀 있었다.

이제 다른 그래프 문제는 쉽게 풀 수 있습니다.

사실

기억해 난 미래의 바보같은 나야

1. bfs는 무조건 queue를 사용하는 것이 기본입니다.


2. dfs 재귀로 해결할 때 전역 변수가 필요합니다.


3. 입력이 수신되면 플로팅 문제를 매트릭스로 저장할 때 나중에 유용합니다.

#include <iostream>
#include <queue>
using namespace std;

int n;
int m;
int v;
int mat(1001)(1001);

int dfs_visited(1002) = {0}; // dfs는 재귀로 풀거라서 전역변수 배열 visited 필요

int dfs(int V){
    cout << V << " ";
    dfs_visited(V) = 1;
    for (int i = 1; i <= n; ++i){
        if(dfs_visited(i)==1 || mat(V)(i) == 0) continue; // 이미 방문했거나 mat에 없다면 스킵
        // V = i
        dfs(i);
    }
    return 0;
}

int bfs(int V){
    int bfs_visited(1002) = {0};
    queue<int> q; // bfs는 항상 queue를 사용한다.

q.push(V); bfs_visited(V) = 1; while(!
q.empty()){ int x = q.front(); cout << x << " "; q.pop(); for (int i = 1; i <= n; ++i){ if(bfs_visited(i)==1 || mat(x)(i) == 0) continue; // 이미 방문했거나 mat에 없다면 스킵 q.push(i); bfs_visited(i) = 1; } } return 0; } int main(){ cin >> n >> m >> v; int x, y; for (int i = 0; i < m; ++i) { cin >> x >> y; mat(x)(y) = mat(y)(x) = 1; // 매트릭스로 그래프 표현 } int V = v; dfs(V); cout << "\n"; bfs(V); return 0; }