C++ BFS检测不应出现的循环
我已经实现了一个BFS算法来检测图中的循环,下面是代码:C++ BFS检测不应出现的循环,c++,C++,我已经实现了一个BFS算法来检测图中的循环,下面是代码: void hasCycle(node *root,string start){ if(root->visted){ if(root->name == start) cout << "Has cycle" << endl; else return; }
void hasCycle(node *root,string start){
if(root->visted){
if(root->name == start) cout << "Has cycle" << endl;
else return;
}
root->visted = true;
int ind;
for(ind = 0; ind < root->adj.size(); ind++)
hasCycle(root->adj[ind], start);
root->visted = false;
}
输出为:
有周期
有周期
有周期
由于没有循环,因此正确的输出为零。我已经花了很多时间调试这个,请帮助
注意:这不是一个有向图,所以我希望它们是双边,我假设您希望无向图中的循环大小为3或更多。在这种情况下,在检查“已访问”时,应忽略BFS遍历中的父项。此处有一些问题:
a->B->C->a
,来自a
的BFS将首先发现a
,然后发现B
和C
,并在那里停止,而不检测循环u
,v
-同时使用u->v
和v->u
(*)start
检测循环,它将错过“laso”循环[可从start
访问但不包含start
]的循环]|V |
的每个连接组件,如果有多于|V |-1
的边,则该组件不是一个,并且该图至少有一个循环列表[因为有向图中的树是没有循环的最大结构]。
因此,为了确定是否存在循环,您可以找到所有连接的组件[BFS对它有好处],并检查每个组件是否包含多于
|V |-1
边
(*)2实际上是可以讨论的——但在标准BFS实现中——这样做没有意义,因为BFS是用于发现节点的,如果您已经使用了一条边,那么连接到它的两个顶点都已经被发现了。A=>B=>A不是一个循环吗?A=>C=>A?@amit这不是一个有向图,所以我希望它们是双边对于无向图,对于大小为
|V |
的每个连接组件,如果有超过|V |-1
的边,则在图中有一个循环。我看不出两次使用边有任何错误。你总是可以从有向图实现中构建无向图。不,我不想要大小为3的循环,它不应该输出任何内容,因为没有循环(在无向图中)。我是说,你必须通过检查父循环来删除大小为2的循环。因此,您正在寻找大小为3或更大的循环。这是一个无向图,父对象始终是子对象的邻居(相对于您的实现为2个循环)。
struct node{
string name;
bool visted;
vector <node *> adj;
};
Graph *grp = new Graph();
grp->addVertex("A");
grp->addVertex("B");
grp->addVertex("C");
grp->addEdge("A","B");
grp->addEdge("B","A");
grp->addEdge("A","C");
grp->addEdge("C","A");