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 检测链表中循环或循环的起始节点