깊이 우선 탐색( Depth First Search )이란?


  • DFS는 그래프를 탐색할 때 쓰는 알고리즘이며 특정 노드에서 인접한 노드들을 방문하며 방문한 정점은 다시 방문하지 않으며 각 분기마다 가능한 가장 멀리 있는 노드까지 탐색하는 알고리즘입니다.




DFS 구현 방법 두 가지


재귀를 이용한 DFS


#include <iostream>
#include <vector>

using namespace std;

constexpr int n = 6;
vector<bool> visited(n);
vector<int> adj[n];

void dfs(int node) {
    cout << node << "\n";
    visited[node] = true;
    for (auto v : adj[node]) {
        if (visited[v]) {
            continue;
        }
        dfs(v);
    }
    return;
}

int main()
{
    adj[1].push_back(2);
    adj[1].push_back(3);
    adj[2].push_back(4);
    adj[2].push_back(5);
    adj[4].push_back(2);

    dfs(1);

    return 0;
}




스택을 이용한 DFS 구현


#include <iostream>
#include <vector>
#include <stack>

using namespace std;

constexpr int n = 6;
stack<int> s;
vector<bool> visited(n);
vector<int> adj[n];

void dfs(int node) {
    visited[node] = true;
    s.push(node);
    while (!s.empty()) {
        int top = s.top();
        s.pop();
        cout << top << "\n";
        for (auto v : adj[top]) {
            if (visited[v]) {
                continue;
            }
            visited[v] = true;
            s.push(v);
        }
    }
    return;
}

int main()
{
    adj[1].push_back(2);
    adj[1].push_back(3);
    adj[2].push_back(4);
    adj[2].push_back(5);
    adj[4].push_back(2);

    dfs(1);

    return 0;
}




너비 우선 탐색( Breadth First Search )이란?


  • BFS는 그래프를 탐색하는 알고리즘이며 어떤 정점에서 시작해 주변 노드들을 순차적으로 탐색하며 방문한 정점은 다시 방문하지 않는 알고리즘입니다. 같은 가중치를 가진 그래프에서 최단거리를 구할 때 사용할 수 있습니다.




BFS 구현 방법


#include <iostream>
#include <vector>
#include <queue>

using namespace std;

constexpr int n = 6;
queue<int> q;
vector<bool> visited(n);
vector<int> adj[n];

void bfs(int node) {
    visited[node] = true;
    q.push(node);
    while (!q.empty()) {
        int top = q.front();
        q.pop();
        cout << top << "\n";
        for (auto v : adj[top]) {
            if (visited[v]) {
                continue;
            }
            visited[v] = true;
            q.push(v);
        }
    }
    return;
}

int main()
{
    adj[1].push_back(2);
    adj[1].push_back(3);
    adj[2].push_back(4);
    adj[2].push_back(5);
    adj[4].push_back(2);

    bfs(1);

    return 0;
}




BFS로 각 경로마다의 최단 거리


#include <iostream>
#include <vector>
#include <queue>

using namespace std;

constexpr int n = 6;
queue<pair<int,int>> q;
vector<bool> visited(n);
vector<int> adj[n];

void bfs(int node) {
    visited[node] = true;
    q.push({ node, 0});
    while (!q.empty()) {
        auto top = q.front();
        q.pop();
        cout << "노드 : " << top.first << ", 거리 : " << top.second << "\n";
        for (auto v : adj[top.first]) {
            if (visited[v]) {
                continue;
            }
            visited[v] = true;
            q.push({ v, top.second + 1});
        }
    }
    return;
}

int main()
{
    adj[1].push_back(2);
    adj[1].push_back(3);
    adj[2].push_back(4);
    adj[2].push_back(5);
    adj[4].push_back(2);

    bfs(1);

    return 0;
}




+ Recent posts