C++;-图循环检测 我正在研究图,我完成了C++中递归实现图的循环检测,这里是我的代码: bool Graph::dfsCyclic(unsigned vt, bool *visited, bool *beingVisited) { beingVisited[vt] = true; bool dfs = false; for (list<unsigned>::const_iterator it = this->adjList[vt].begin(); it!= this->adjList[vt].end(); ++it) { if (beingVisited[*it]) { return true; } if (!visited[*it]) { dfs = this->dfsCyclic(*it, visited, beingVisited); } } visited[vt] = true; beingVisited[vt] = false; return dfs; } bool Graph::isCyclic() { bool visited[this->v]; bool beingVisited[this->v]; for (unsigned i = 0; i < this->v; ++i) { visited[i] = false; beingVisited[i] = false; } for (unsigned i = 0; i < this->v; ++i) { if (dfsCyclic(i, visited, beingVisited)) { return true; } } return false; } bool图::dfscyclical(未签名vt、bool*已访问、bool*正在访问){ 被访问的,被访问的; bool-dfs=false; 对于(list::const_iterator it=this->adjList[vt].begin();it!=this->adjList[vt].end();++it){ 如果(正在访问[*it]){ 返回true; } 如果(!已访问[*it]){ dfs=此->DFSCyclical(*it、已访问、正在访问); } } 访问[vt]=真; 被访问的,被访问的; 返回dfs; } 布尔图::isCyclic(){ 布尔访问了[这个->v]; 布尔被访问[这个->v]; for(无符号i=0;iv;++i){ 访问[i]=错误; 被访问[i]=错误; } for(无符号i=0;iv;++i){ if(i,已访问,正在访问)){ 返回true; } } 返回false; }

C++;-图循环检测 我正在研究图,我完成了C++中递归实现图的循环检测,这里是我的代码: bool Graph::dfsCyclic(unsigned vt, bool *visited, bool *beingVisited) { beingVisited[vt] = true; bool dfs = false; for (list<unsigned>::const_iterator it = this->adjList[vt].begin(); it!= this->adjList[vt].end(); ++it) { if (beingVisited[*it]) { return true; } if (!visited[*it]) { dfs = this->dfsCyclic(*it, visited, beingVisited); } } visited[vt] = true; beingVisited[vt] = false; return dfs; } bool Graph::isCyclic() { bool visited[this->v]; bool beingVisited[this->v]; for (unsigned i = 0; i < this->v; ++i) { visited[i] = false; beingVisited[i] = false; } for (unsigned i = 0; i < this->v; ++i) { if (dfsCyclic(i, visited, beingVisited)) { return true; } } return false; } bool图::dfscyclical(未签名vt、bool*已访问、bool*正在访问){ 被访问的,被访问的; bool-dfs=false; 对于(list::const_iterator it=this->adjList[vt].begin();it!=this->adjList[vt].end();++it){ 如果(正在访问[*it]){ 返回true; } 如果(!已访问[*it]){ dfs=此->DFSCyclical(*it、已访问、正在访问); } } 访问[vt]=真; 被访问的,被访问的; 返回dfs; } 布尔图::isCyclic(){ 布尔访问了[这个->v]; 布尔被访问[这个->v]; for(无符号i=0;iv;++i){ 访问[i]=错误; 被访问[i]=错误; } for(无符号i=0;iv;++i){ if(i,已访问,正在访问)){ 返回true; } } 返回false; },c++,graph,depth-first-search,cyclic,C++,Graph,Depth First Search,Cyclic,我想知道你们是否认为这是一个好的实现。我做了一些测试,效果很好。我还想知道我如何制作这个代码的迭代版本,我已经尝试过了,但是我遇到了一些问题。提前感谢您的帮助!还有,我可以证明这段代码的正确性吗?看来您正在寻找代码审查。对于这些,您应该转到。当对dfscyclical的调用返回true时,您可以中止dfscyclical,而不是继续遍历列表,这将加快它的速度。此DFS的迭代版本非常简单;你遇到了什么麻烦?@Beta我在for循环中遇到了麻烦,在这个例子中我使用递归,在迭代版本中我使用堆栈,而(!

我想知道你们是否认为这是一个好的实现。我做了一些测试,效果很好。我还想知道我如何制作这个代码的迭代版本,我已经尝试过了,但是我遇到了一些问题。提前感谢您的帮助!还有,我可以证明这段代码的正确性吗?

看来您正在寻找代码审查。对于这些,您应该转到。当对
dfscyclical
的调用返回true时,您可以中止
dfscyclical
,而不是继续遍历列表,这将加快它的速度。此DFS的迭代版本非常简单;你遇到了什么麻烦?@Beta我在for循环中遇到了麻烦,在这个例子中我使用递归,在迭代版本中我使用堆栈,而(!stack.empty())我在做if(beingvisted[*it]){return true;}if(!visted[*it]){stack.push(*it);}}但这不起作用