因此,我按照以下方法以迭代方式实现了深度优先搜索:
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)检测无向图中的循环。现在,我读到了这样一句话:
如果未探索的边导致到达之前访问过的节点,则该图包含一个循环。
因此,我只想问你,我应该如何确切地跟踪所有这些内容?我将我的图形设置为这样:
class graph
{
public:
int vertices;
vector < vector<int> > edges;
};
我应该将上面的内容改为什么呢?
class graph
{
public:
int vertices;
vector < vector<pair<int,bool> > edges;
};
每条边的bool
将被标记为true的位置在哪里?并且我需要对上面的DFS代码进行哪些更改才能检测出循环?我尝试过了,但是确实想不出该怎么做。谢谢!
if (arr[*it] == false){ mystack.push(*it); }
如果你发现 arr[*it] 为 true,我认为你刚刚检测到一个循环。在这种情况下,边是未探索的,因为你刚刚第一次访问了 k,并且找到了一个已访问的节点。 - Gerard Abello