Β«   2025/04   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Recent Posts
04-13 04:25

Today
Total

Recent Comments
관리 메뉴

μ—°μ˜ 기둝 πŸͺ

[C++ μ•Œκ³ λ¦¬μ¦˜] 무ν–₯κ·Έλž˜ν”„ 사이클 dfs λ³Έλ¬Έ

Computer Science/자료ꡬ쑰 & μ•Œκ³ λ¦¬μ¦˜

[C++ μ•Œκ³ λ¦¬μ¦˜] 무ν–₯κ·Έλž˜ν”„ 사이클 dfs

kite707 2025. 1. 21. 22:53

dfsλ₯Ό μ‘μš©ν•˜μ—¬ 무ν–₯κ·Έλž˜ν”„μ—μ„œμ˜ 사이클을 νŒλ‹¨ν•  수 μžˆλŠ” μ½”λ“œμ΄λ‹€. 

 

κ°„λ‹¨ν•˜κ²Œ μ„€λͺ…ν•˜μžλ©΄ 점을 ν•˜λ‚˜μ”© μˆœνšŒν•˜λ©° 사이클이 μ‘΄μž¬ν•˜λŠ”μ§€ νŒλ³„ν•˜λŠ” μ½”λ“œμ΄λ‹€.

 

예λ₯Ό λ“€μ–΄ μ•„λž˜μ™€ 같은 κ·Έλž˜ν”„κ°€ μžˆλ‹€κ³  ν•˜μž.

 

눈으둜 λ΄μ„œλŠ” 2 3 5 사이클이 μ‘΄μž¬ν•¨μ„ μ•Œ 수 μžˆλ‹€. μ•„λž˜ μ½”λ“œμ—μ„œλŠ” 1μ—μ„œλΆ€ν„° dfsλ₯Ό ν•˜λ©° λ°”λ‘œ 사이클을 찾게 λœλ‹€.

dfs κ°€μž₯ μ•„λž˜ path.pop_back()은 4와 같이 사이클에 ν¬ν•¨λ˜μ§€ μ•ŠλŠ” λ…Έλ“œλ₯Ό μ œκ±°ν•˜λŠ” μ½”λ“œμ΄λ‹€. μΈμ ‘ν•œ λ…Έλ“œκ°€ 전에 λ°©λ¬Έν•œ λ…Έλ“œλ°–μ— 없을 λ•Œμ˜ κ²½μš°μ΄λ‹€.

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

using namespace std;

vector<vector<int>> graph; // κ·Έλž˜ν”„ 인접 리슀트
vector<pair<int, int>> edges; // κ°„μ„  정보
vector<bool> visited;
vector<int> path;

bool dfs(int cur, int prev) {
    cout << "cur is " << cur << endl;
    path.push_back(cur);
    visited[cur] = true;
    for (auto k : graph[cur]) {
        if (!visited[k]) {
            if (dfs(k, cur))return true;
        }
        else if (k != prev) {
            path.push_back(k);
            return true;
        }
    }
    path.pop_back();
    return false;

}

vector<int> findCycle(int n) {
    for (int i = 1; i <= n; i++) {
        path.clear();
        vector<int> ans;
        if (dfs(i, -1)) {
            int start = path.back();
            while (!path.empty()) {
                int cur = path.back();
                path.pop_back();
                ans.push_back(cur);
                if (cur == start && ans.size() > 1) {
                    return ans;
                }
            }
        }
    }
    return {};
}
int main() {
    int n = 6; // λ…Έλ“œ 수
    edges = { {1, 2}, {2, 3}, {3, 4}, {3, 5}, {5,2} };
    visited.assign(n, false);
    // κ·Έλž˜ν”„ μ΄ˆκΈ°ν™”
    graph.assign(n + 1, vector<int>());
    for (auto edge : edges) {
        graph[edge.first].push_back(edge.second);
        graph[edge.second].push_back(edge.first);
    }
    vector<int> vec = findCycle(n);

    if (!vec.empty()) {
        for (auto k : vec) {
            cout << k << " ";
        }
        cout << endl;
    }
    else {
        cout << "NO CYCLE\n";
    }


    return 0;
}

 

κ΄€λ ¨ 문제λ₯Ό ν’€μ–΄λ³Ό 수 μžˆλŠ” λΈ”λ‘œκ·Έ

https://velog.io/@jeon0976/Data-Structure-Algorithms-Cycle-Detection-in-Graphs-%EC%82%AC%EC%9D%B4%ED%81%B4-%ED%8C%90%EB%B3%84