【发布时间】:2020-01-12 16:31:26
【问题描述】:
有人知道如何在 OCaml 中检测无向图中是否存在循环吗?
这是我用于图表的类型:
type 'a graph = { nodes : 'a list; edges : ('a * 'a * int) list }
例如,我想检查此图是否包含循环:
let graph = { nodes = ['a'; 'b'; 'c'; 'd'; 'e'; 'f'; 'g'; 'h'; 'j';];
edges = [('c', 'j', 9); ('d', 'e', 8); ('a', 'b', 8); ('b', 'c', 7); ('f', 'g', 6); ('b', 'h', 4); ('a', 'd', 4); ('g', 'h', 2); ('b', 'f', 2); ('e', 'g', 1)]}
【问题讨论】:
-
在有循环的图上使用图遍历算法会发生什么?你做了什么实验?你在哪里卡住了?您是否有一些无法正常工作的起始代码?如果您花更多的时间来构思您的问题,将会更有帮助。
-
我正在实现 Kruskal 的最小生成树算法,但我一直在检测我已经提取的边中是否存在循环。所以,我有一个像我在示例中编写的图表,并且我正在迭代它,每次取最小权重的边,但我不能取一个产生循环的边。所以,现在我被它困住了,因为我不知道如何检测是否存在循环。
-
如果您跟踪到目前为止您所看到的节点,您可以通过检查当前节点是否在所见节点集中来检测您是否处于循环中。
-
我无法跟踪它们,或者至少我不知道如何跟踪它们,因为我只考虑边缘。所以在我看来,我应该每次都做一些算法(DST或类似的)来检查是否有一条通往初始节点的路径,但我也不知道我会怎么做。我是 OCaml 的新手。我也在阅读 Kruskal 的算法应该包含联合查找算法,但我不知道如何实现它。 stackoverflow.com/questions/4290163/…
-
这是一个更好的问题,您应该编辑您的初始问题以添加这种最少的信息。是的,union-help 可用于检测两个顶点是否属于图的相同连通分量。