查找有向Graph Golang中的所有循环

时间:2017-05-15 14:29:15

标签: go graph cycle

我尝试使用Golang(或至少一些)生成有向图中包含的所有循环。
我目前有两个结构:

Node : { ID (string), resolved (bool), edges ([]Edge) }  
Edge : { ID (string), start (Node), end (Node), weight (Float64)}  

循环重量不是问题(暂时)。 我找到了一些关于如何检测周期或找到最短路径等的答案,但我没有找到一个可以帮助我的算法。
我该怎么办? (欢迎提出任何建议)

2 个答案:

答案 0 :(得分:2)

问题分为两部分。

关于检测图中所有周期的算法,请看一下这个相关的问题(因为这不是针对特定的),有一些有用的解释和伪代码可以用来实现你的解决方案。

Finding all cycles in a directed graph

根据具体的go代码,有几个库可以处理图形,您可以查看它们的文档和源代码(它们甚至可以提供开箱即用的功能来解决你的问题)。

例如:https://godoc.org/github.com/twmb/algoimpl/go/graph

答案 1 :(得分:0)

我建议从定义一个循环开始 - 例如让我们假设它是遍历图形的遍历在同一节点中的遍历。

要使用此定义枚举所有循环,您需要考虑从所有节点开始的所有路径,并检查这些路径中是否有任何路径返回到它们的起点。

但是,请注意,这个定义实际上可以多次计算每个循环子图 - 沿循环路径的任何节点 - 是一个循环还是几个?如果几个周期的路径相交,周期路径的数量急剧增加,并且不太清楚哪些周期“相同”,事情会变得更加复杂。

我希望很容易看出蛮力方法对于除了非常小而简单的图形之外的任何东西都是难以处理的,并且关注最小周期甚至只是识别循环子图的东西足以满足您的需要。

正如@eugenioy已经提到的,这已经是asked before,您可以通过查看该主题中的答案来缩小您的问题范围。

所以,根据你所说的“全部”和你所说的“周期”的含义,你可能会找到一种算法,以你感兴趣的相同方式定义周期,然后问一个更有针对性的问题如果您在将其翻译为Go时遇到问题,我认为目前您的问题并不正确。