SML中的强连通组件(SCC图算法)

时间:2010-01-30 15:05:23

标签: algorithm sml smlnj

我需要在标准ML中编写SCC算法。但我不知道怎么做 我有以下TYPE,必须在代码中使用:

type vertex = int
type edge = int * int
type graph = (vertex * vertex list) list


fun dfs (g: graph) (n: vertex): vertex list = 
  let
    fun helper (todo: vertex list) (visited: vertex list): vertex list =
    case todo of
      [] => []
    | h::t => if (List.exists (fn x => x = h) visited)
                then helper t visited
                else
                  let
                    val adj = case List.find (fn (n, _) => n = h) g of
                                NONE => raise Fail "incomplete adjacency list"
                              | SOME (_, adj) => adj
                  in
                    h :: (helper (adj @ t) (h::visited))
                  end
  in
    helper [n] []
  end

以上代码已经编译并正确运行 我把这些放在代码中,因为我知道在计算SCC时需要dfs 有没有人有解决方案?

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:-1)

我猜你正在尝试使用标准ML(http://www.smlnj.org/sml.html)。

在课堂上,您的老师应该提供一个用于创建SML代码的建模工具,或者应该将您引导到用于编写代码的资源。他/她也应该提供示例代码 - 您的书(或书后面的CD)应该包含SML代码。

假设您没有建模工具,我的建议如下。首先参考教师或书籍提供的示例代码,然后选择能够解决与您的需求最相似的问题的代码。复制&把它粘贴到你的答案中,绝对肯定会在答案的最开始时清楚地引用来源。然后,使用课程中的其他示例,您的书中的详细信息以及smlnj.org(特别是教程)的“文档和文献”部分下的资源来实现您的解决方案。

然后,如果你有一个绊脚石 - 一些在课堂上没有讨论过的东西,并且你的书中没有涉及,但你无法解决,你应该与你的TA或老师讨论。如果您向其中一个人提问,那么您的老师可以发现课程中没有明确涵盖该主题。如果你不问他们,那么他们就不会知道,你班上其他人的大部分都可能会遇到这个问题。

最后,如果您的老师和助教不可用,并且您遇到了一个您不知道如何解决的问题,并且您有一个非常具体的问题(例如,“这是我的代码;它不会编译,我无法弄清楚为什么“),那时你应该问Stack Overflow。