C++ 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; }

我已经实现了一个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;
            }
输出为: 有周期 有周期 有周期

由于没有循环,因此正确的输出为零。我已经花了很多时间调试这个,请帮助


注意:这不是一个有向图,所以我希望它们是双边,我假设您希望无向图中的循环大小为3或更多。在这种情况下,在检查“已访问”时,应忽略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是用于发现节点的,如果您已经使用了一条边,那么连接到它的两个顶点都已经被发现了。

    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");