BFS检测不应该出现的循环
BFS detecting cycles where it should not be
我已经实现了一个BFS算法来检测图中的循环,这是以下代码:
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;
}
其中,start是起始节点。其中node是以下结构:
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");
输出为:有周期有周期具有周期
正确的输出是零,因为没有循环。我花了很多时间试图调试这个,请帮忙!
注意:这不是一个有向图,所以我希望它们是双边
我想您希望在无向图中有一个大小为3或更大的循环。在这种情况下,在检查"visited"时,应该忽略BFS遍历中的父级。
此处的一些问题:
- 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是用来发现节点的,如果你已经使用了一条边,那么连接到它的两个顶点都已经被发现了。
相关文章:
- 下面是我为检测链接列表中的循环而制作的代码
- 如何在贝尔曼福特算法中检测负循环?
- 对于循环不循环和检测字符数组 [指针和字符数组]
- QML 检测到属性宽度的绑定循环(TextMetrics 行为很奇怪)
- 使用不带无限循环的 C++ i 检测文本文件中的更改
- C++ 比较 2 个不同列表中的值以使用 2 for 循环摆脱重复的数字。无法正确检测重复项
- 该功能检测循环链接列表的时间复杂性是什么?
- Qt-如何在不使用插槽的情况下检测自定义事件循环中的关闭窗口
- 为什么我在图中的DFS循环检测总是返回true
- C++地图上的循环没有检测到地图末端的变化
- 需要有关如何在我的 2d directx 9 游戏中迭代嵌套循环以进行碰撞检测的帮助或建议
- 从文本文件中检测有向图中的循环
- 正在检测循环对
- 为什么此循环不检测空指针?
- 无法使用 cin.get 来检测周期来中断循环
- 使用两个语句并行化 while 循环(弗洛伊德循环检测算法)
- 设置 for 循环以循环,直到检测到空字节
- 当 COUT 不起作用时,如何检测无限循环?
- Opencv循环检测- RAM加载
- 图中循环检测算法的改进