从昨天开始我就被这个问题困住了。不幸/幸运的是,这个问题只占我的超级巨大(对我来说,一个 c++ 新手)算法的 0.5%,因此需要一个现有代码库,一个人可以适应并让事情正常工作。
我想检测并给出无向图中的所有圆圈。我的边缘没有加权。是的,我真正需要的是所有循环,即类似于有向图的所有哈密顿循环
我一直在玩 boost 图形库,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()
像这样访问 boost 给我的所有三个周期std::vector<uInt32> fCycle1, fCycle2,fCycle3
。我得到back_edge()
的只是源顶点和目标顶点。
我将不胜感激任何帮助和提示。到目前为止,这里的所有示例都只是检测循环的存在或其数量,但没有一个示例显示如何列出所有存在的循环。