使用增强图库检测无向图中的循环

时间:2012-03-08 22:47:31

标签: boost boost-graph hamiltonian-cycle

我从昨天开始就遇到了这个问题。不幸的是/幸运的是,这个问题只占我超级巨大(对我来说是一个c ++新手)算法的0.5%左右,因此需要一个现有代码库,人们可以适应并使事情有效。

我想检测并发出无向图中的所有圆圈。我的边缘没有加权。是的,我需要的是所有的周期,即有向图的所有哈密顿循环之类的东西

我一直在玩增强图库,DFS算法似乎非常有用,但它只访问顶点一次,因此无法给出所有哈密顿圈。

目前,我只需要代码就可以工作,这样我就可以继续我的算法设计,之后我可能会考虑性能问题。即使是具有5个嵌套for循环的解决方案也是受欢迎的。

这是我从boost获得和使用的代码,但我不知道如何记录和访问我的back_edges的前辈,即使这已解决,boost DFS也只访问顶点一次:

struct detect_loops : public boost::dfs_visitor<>
{
   template <class Edge, class Graph>
   void back_edge(Edge e, const Graph& g) {
      std::cout << source(e, g)
        << " -- "
        << target(e, g) << "\n";
   }
};

int main(int,char*[])
{
    typedef std::pair<int,int> Edge;
    std::vector<Edge> edges;
    edges.push_back(Edge(0,1));
    edges.push_back(Edge(1,2));
    edges.push_back(Edge(2,3));
    edges.push_back(Edge(3,1));
    edges.push_back(Edge(4,5));
    edges.push_back(Edge(5,0));
    edges.push_back(Edge(4,0));
    edges.push_back(Edge(5,6));
    edges.push_back(Edge(2,6));

    typedef adjacency_list<
       vecS, vecS, undirectedS, no_property,
       property<edge_color_t, default_color_type>
    > graph_t;
    typedef graph_traits<graph_t>::vertex_descriptor vertex_t;

    graph_t g(edges.begin(), edges.end(), 7);

    std::cout << "back edges:\n";
    detect_loops vis;
    undirected_dfs(g, root_vertex(vertex_t(0)).visitor(vis).edge_color_map(get(edge_color, g)));
    std::cout << std::endl;

    return 0;
} 

上面的例子说通常只有3个周期我会期望超过4个周期,因此单个顶点可能出现在多个周期中。其次,我甚至无法访问提升back_edge()给我的所有三个周期std::vector<uInt32> fCycle1, fCycle2,fCycle3。我从back_edge()获得的只是源顶点和目标顶点。

我会感激任何帮助和提示。到目前为止,这里的所有示例都只是检测周期或其数量的存在,但没有显示如何列出所有存在的周期。

0 个答案:

没有答案