c_cpp 使用颜色在有向图中检测循环

Posted

tags:

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

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

enum color {white, gray, black};
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 , int []);
};
bool graph::isCyclicUtil(int s, int color[]) {
    color[s]= gray;

    list<int>::iterator i;
    for (i= adj[s].begin(); i!= adj[s].end(); ++i) {
        if (color[*i]== gray)
            return true;
        if (color[*i]= white && isCyclicUtil(*i, color))
            return true;
    }
    color[s]= black;
    return false;
}
bool graph::isCyclic() {
    int color[v] = {white};

    for (int i=0;i<v; i++)
        if (color[i]== white)
            if (isCyclicUtil(i, color)== true)
                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);

    g.isCyclic()? cout<< "cyclic!": cout<< "acyclic";
}

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

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

c_cpp 在Graph |中检测负循环(贝尔曼福特)

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

c_cpp 循环检测 - Hackerrank

c_cpp 检测无向图中的循环

python 实现有向图和相关的DFS,循环检测算法