c_cpp 检测有向图中的循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 检测有向图中的循环相关的知识,希望对你有一定的参考价值。

//https://www.geeksforgeeks.org/detect-cycle-in-a-graph/
#include <bits/stdc++.h>
using namespace std;

class graph {
    int v;
    list <int> *adj;
public:
    graph (int v) {
        this->v = v;
        adj= new list<int> [v];
    }
    void addEdge (int u, int w) {
        adj[u].push_back(w);
    }
    bool isCyclic();
    bool isCyclicUtil (int , bool [], bool []);
};
bool graph::isCyclicUtil(int s, bool visited[], bool present[]) {
    if (!visited[s]) {
        visited[s]= {1};
        present[s] = {1};

        list<int>::iterator i;
        for (i= adj[s].begin(); i!= adj[s].end(); ++i) {
            if (!visited[*i] && isCyclicUtil(*i, visited, present))
                return true;
            else if (present[*i])
                return true;
        }
    }
    present[v] = 0;
    return 0;
}
bool graph::isCyclic() {
    bool visited[v] = {0};
    bool present[v] = {0};

    for (int i=0; i<v; i++) {
        if (isCyclicUtil (i,visited, present))
            return true;
    }
    return false;
}

int main() {
    graph g(88);
    g.addEdge(12, 28);
    g.addEdge(67, 17);
    g.addEdge(0, 26);
    g.addEdge(30,11);
    g.addEdge(38, 85);
    g.addEdge(57, 60);
    g.addEdge(57, 15);
    g.addEdge(75, 31);
    g.addEdge(65, 80);
    g.addEdge(75, 19);
    g.addEdge(68, 67);
    g.addEdge(73, 84);
    g.addEdge(63, 86);

    if (g.isCyclic())
        cout<< "is cyclic";
    else
        cout<< "not cyclic!";
}

以上是关于c_cpp 检测有向图中的循环的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 检测链表中的循环

循环有向图和无向图

在有向图中使用 DFS 进行循环检测是不是绝对需要回溯?

c_cpp 循环检测 - Hackerrank

c_cpp 检测无向图中的循环

c_cpp 检测链表中循环或循环的起始节点