好吧,我没有看到任何 C++ 代码,但我会尝试建议一个 C++ 解决方案(尽管我不会为你编写它)。
如果您的图是无向的(如果它是有向的,s/adjacent/in-edges' vertices/),并且您想找到通过某个顶点 N 的所有最短循环,那么我认为您可以遵循以下过程:
G <= a graph
N <= some vertex in G
P <= a path (set of vertexes/edges connecting them)
P_heap <= a priority queue, ascending by distance(P) where P is a path
for each vertex in adjacent(N):
G' = G - edge(vertex, N)
P = dijkstraShortestPath(vertex, N, G')
push(P, P_heap)
您也可以只丢弃除最短循环之外的所有循环,但这不那么简洁。只要您不允许负边权重(因为您将使用线段长度作为权重,所以您不允许),我认为这应该可行。此外,幸运的是,Boost.Graph 提供了在 C++ 中执行此操作所需的所有功能(您甚至不必实现 Dijkstra 的算法)!您可以在此处找到有关它的文档:
http://www.boost.org/doc/libs/1_47_0/libs/graph/doc/table_of_contents.html
编辑:您必须先从您首先列出的数据创建图表,然后才能执行此操作,因此您只需相应地定义图表的 property_map 并确保您要插入的顶点与当前所有顶点之间的距离图形大于零,否则顶点已经在图形中,您不想再次插入它。
快乐的绘图!