我已经实现了一个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");
输出是: 有周期 有周期 有周期
由于没有循环,因此输出正确。我花了很多时间尝试调试,请帮助!
注意:这不是有向图,所以我希望它们是双边
答案 0 :(得分:1)
我认为你想要一个无向图中大小为3或更大的循环。在这种情况下,您应该在检查“已访问”时忽略BFS遍历中的父级。
答案 1 :(得分:0)
这里的一些问题:
A->B->C->A
,来自A
的BFS将首先发现A
,然后发现B
和C
,并停在那里 - 没有检测到循环。u
,v
实施 - 它同时使用u->v
和v->u
(*)< / LI>
start
检测循环,它将错过“laso”循环[可从start
访问的循环,但不包含start
]。 可能的解决方案:请注意,对于非定向图,对于大小为|V|
的每个连接组件,如果有更多|V|-1
个边 - 组件不是a tree,图表列表中有一个周期[因为有向图中的树是没有周期的最大结构]。
因此,为了找出是否存在循环 - 您可以找到所有连接的组件[BFS对它有用],并检查每个这样的组件是否包含多个|V|-1
边。
(*)2实际上是有争议的 - 但是在标准的BFS实现中 - 没有必要这样做,因为BFS用于发现节点,如果你已经使用过边缘 - 已经发现了连接到它的两个顶点。