簡體   English   中英

我們是否總是通過轉換為雙向有向圖來檢測無向圖中的循環

[英]Do we always detect cycle in an undirected graph by converting into a bidirectional directed graph

我看到在無向圖中檢測循環的方法大多被視為雙向有向圖:

a-b = a->b && b->a

這是標准的方式嗎? 或者有什么簡單的方法?

這是在有向圖中檢測循環的代碼。 這里node是節點數: 0,1,..., node-1 pairs[i] = {a,b}表示以a->b方向連接 a 和 b 的字符串。

bool NoCyc(int node, vector<vector<int>> paris) {
    vector<vector<int>> graph(node, vector<int>());
    vector<int> visit(node);
    for (auto a : paris) {
        graph[a[1]].push_back(a[0]);
    }
    for (int i = 0; i < node; ++i) {
        if (!NoCyc(graph, visit, i)) return false;
    }
    return true;
}

bool NoCyc(vector<vector<int>>& graph, vector<int>& visit, int i) {
    if (visit[i] == -1) return false;
    if (visit[i] == 1) return true;
    visit[i] = -1;
    for (auto a : graph[i]) {
        if (!NoCyc(graph, visit, a)) return false; 
    }
    visit[i] = 1;
    return true;
}

編輯:

我發現這種方式是錯誤的,因為兩個節點之間的單個字符串將被視為一個循環。

我認為在無向圖中,您可以將圖拆分為連接的組件(例如使用 dfs、bfs)。 如果組件邊數之一不是節點 - 1,則它包含循環。 (否則邊數是節點 -1 什么是樹)在無向圖中,您可以使用此https://cp-algorithms.com/graph/finding-cycle.html算法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM