Java 拓扑排序算法及其实现

Java 拓扑排序算法及其实现,java,algorithm,topological-sort,Java,Algorithm,Topological Sort,我正在研究解决以下问题的算法: 我们有一定数量的课程,每门课程都有其先决条件。找出最长的课程顺序,这样序列中的每一个课程,前一个课程就是它的前置课程 我知道这显然是一个拓扑排序将派上用场的问题,但我在算法和实现方面遇到了一些困难。对于算法,我的第一个想法是,我们应该能够运行一个标准的拓扑排序算法,并且只保留一个计数器,当我们“看到”某个课程时,该计数器将计算该课程是否为预请求 我决定最好将图形表示为邻接列表。我大致了解到目前为止的实施情况 public Vertex{ private

我正在研究解决以下问题的算法:

我们有一定数量的课程,每门课程都有其先决条件。找出最长的课程顺序,这样序列中的每一个课程,前一个课程就是它的前置课程

我知道这显然是一个拓扑排序将派上用场的问题,但我在算法和实现方面遇到了一些困难。对于算法,我的第一个想法是,我们应该能够运行一个标准的拓扑排序算法,并且只保留一个计数器,当我们“看到”某个课程时,该计数器将计算该课程是否为预请求

我决定最好将图形表示为邻接列表。我大致了解到目前为止的实施情况

 public Vertex{
     private String courseName;
     private Vertex[] edges; //Represents all of this courses pre-reqs.

     public addEdge(Vertex v); //Add's a pre-req
     public getEdges();        //Returns array of edges
     public getEdge(int index);//Return edge at specific index
 }
然后在主程序中,“图形”将只是一个顶点数组:

 Vertex graph[] = new Vertex[num];

如果任何人对算法或实现有任何想法、链接、提示等,请随时分享。我的目标是O(n+m)时间,其中n是课程数量,m是预科要求数量

你是要我们向你解释拓扑排序吗?那就去找教程吧。无法理解具体内容,请联系我们。:)我知道我主要倾向于图形,所以:每门课程都是一个节点,每一个先决条件都是节点之间的一条有向边(决定方向——不太重要,只要方向一致)。然后在图中找到最长的路径。然后就是@therainmaker我对拓扑排序感到很满意,但我正在寻求帮助将它应用到这个问题上。@Shapiroyacov:你解释的图形公式是正确的。但是,在本例中,最后一行关于在图中查找最长路径的内容是不正确的。这个问题是NP难的,这里不需要。塔伦:您可以将拓扑排序应用于上面解释的图形公式。还有疑问吗?@therainmaker,我同意拓扑排序不是最长路径,但OP似乎在问如何将topsort应用于他们的问题。这是一个有效的问题(尽管对于SO来说可能是离题的),上面的链接回答了这个问题。