因此,我通过以下方法以迭代方式实现了DFS:
void dfsiter (graph * mygraph, int foo, bool arr[])
{
stack <int> mystack;
mystack.push(foo);
while (mystack.empty() == false)
{
int k = mystack.top();
mystack.pop();
if (arr[k] == false)
{
cout<<k<<"\t";
arr[k] = true;
auto it = mygraph->edges[k].begin();
while (it != mygraph->edges[k].end())
{
if (arr[*it] == false)
{
mystack.push(*it);
}
it++;
}
}
}
}
以上代码完全正常。现在,我想使用上面的代码(迭代DFS)检测无向图中的循环。现在,我读到了,If an unexplored edge leads to a node visited before, then the graph contains a cycle.
因此,我只想问你,我如何准确地记录下这一切?
我的图表是这样的:
class graph
{
public:
int vertices;
vector < vector<int> > edges;
};
我应该将上述内容更改为:
class graph
{
public:
int vertices;
vector < vector<pair<int,bool> > edges;
};
每个边缘的bool
将被标记为真?在上面的DFS代码中我需要做些什么改变来检测周期?我尝试过,但我真的想不出办法。谢谢!
答案 0 :(得分:4)
您可以在DFS树中为每个顶点 v 存储“父”节点 f ,即DFS从顶点 v 。例如,它可以存储在堆栈中。在这种情况下,您将对存储在堆栈中,第一个值是顶点 v ,第二个值是其父 f 。
当且仅当你遇到已经访问过的顶点 w 的边 vw 时,无向图才有一个循环,这不是 v <的父亲/ em>的
您可以在下面看到修改后的代码。
{{1}}
注意:如果图形断开连接,则必须从多个顶点启动DFS,以确保访问整个图形。它可以在 O(V + E)总时间内完成。