我有一组线段。每个只包含2个节点。我想找到通过连接线段产生的可用闭合循环。实际上,如果存在多个事件,我正在寻找最小的循环。如果可以的话,请给我一个很好的解决方案。 因此,例如,我已将下面的行列表与其点索引一起添加,以了解m情况。 (其中第一个值=行号,第二个值是点索引)
0 - 9 11
1 - 9 18
2 - 9 16
3 - 11 26
4 - 11 45
5 - 16 25
6 - 16 49
7 - 18 26
8 - 18 25
9 - 18 21
10 - 25 49
11 - 26 45
所以,假设我已经从第1行开始了。那就是我已经开始从第9,18点开始找到连接的循环。然后,你能解释一下(一步一步)如何从中获取“闭环”那条线。
答案 0 :(得分:1)
好吧,我没有看到任何C ++代码,但我会尝试建议一个C ++解决方案(虽然我不打算为你编写)。
如果您的图是无向的(如果它是定向的,s /相邻/边缘'顶点/),并且您想要找到通过某个顶点N的所有最短周期,那么我认为您可以遵循以下过程:< / p>
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,并确保你要插入的顶点和所有顶点之间的距离当前在图中的顶点大于零,因为否则顶点已经在图中,您不想再次插入它。
快乐的图表!