BFS检测不应该的周期

时间:2012-02-28 01:54:20

标签: c++

我已经实现了一个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");

输出是:                 有周期                 有周期                 有周期

由于没有循环,因此输出正确。我花了很多时间尝试调试,请帮助!

注意:这不是有向图,所以我希望它们是双边

2 个答案:

答案 0 :(得分:1)

我认为你想要一个无向图中大小为3或更大的循环。在这种情况下,您应该在检查“已访问”时忽略BFS遍历中的父级。

答案 1 :(得分:0)

这里的一些问题:

  1. BFS不适合在图表中查找周期。例如,查看无向图A->B->C->A,来自A的BFS将首先发现A,然后发现BC,并停在那里 - 没有检测到循环。
  2. 您的实现不应该使用无向边两次,并且您的实现对于每个uv实施 - 它同时使用u->vv->u(*)< / LI>
  3. 您的实现仅通过start检测循环,它将错过“laso”循环[可从start访问的循环,但不包含start]。
  4. 可能的解决方案:请注意,对于非定向图,对于大小为|V|的每个连接组件,如果有更多|V|-1个边 - 组件不是a tree,图表列表中有一个周期[因为有向图中的树是没有周期的最大结构]。
    因此,为了找出是否存在循环 - 您可以找到所有连接的组件[BFS对它有用],并检查每个这样的组件是否包含多个|V|-1边。

    (*)2实际上是有争议的 - 但是在标准的BFS实现中 - 没有必要这样做,因为BFS用于发现节点,如果你已经使用过边缘 - 已经发现了连接到它的两个顶点。