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,循环检测算法