DFS(깊이 우선 탐색)

학교 다닐때에도 배우지 못한 것은 애가 대학교에 다니면서 같이 배우게 된다.

(퍼온 곳 : [알고리즘] 그래프(Graph)의 탐색 – DFS(깊이 우선 탐색)

깊이우선탐색은 스택을 이용해서 갈 수 있는 만큼 최대한 많이 간 다음, 갈 수 없으면 이전의 정점으로 돌아가는 방식을 사용한다.  최단경로를 추척할 때 사용하기도 하지만 최적의 경로를 보장하지 않는다.

다른 검색 방식으로 넓이 우선 방식도 있다.

 

/*
n = 정점 개수
m = 간선 갯수
start = 시작 번호

u, v = 점 u와 점 v가 이어진다.

ex) 6 7 1
1 2
1 5
2 3
2 5
3 4
4 5
4 6
*/

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>

using namespace std;

vector<int> a[1001];
bool check[1001];

void dfs(int node)
{
    check[node] = true; // 현재 노드를 방문했다는 표시
    cout << node << " "; // 방문한 노드 출력

    // 노드 수 만큼
    for (int i = 0; i < a[node].size(); i++)
    {
        int next = a[node][i]; // 다음 방문할 노드를 저장

        if (check[next] == false) // 방문할 노드의 방문 표시가 없다면 탐색 ㄱㄱ
            dfs(next);
    }
}

void printValue(int m) {
    // 내용을 출력
    for (int i=0;i<m;i++) {
        for (int j=0;j<a[i].size();j++) {
            cout << a[i][j] << " ";
        }
        cout << "\n";
    }
    cout << "\n";
}

int main() {

    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int n, m, start;
    cin >> n >> m >> start;

    // 그래프 입력
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;

        a[u].push_back(v);
        a[v].push_back(u);
    }

    // 입력한 간선 정렬
    for (int i = 1; i <= n; i++)
        sort(a[i].begin(), a[i].end());

    printValue(m);

    // 탐색하여 결과 출력하는 함수
    dfs(start);
    puts("");

    return 0;
}

Leave a Comment

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.