拓扑排序的度数,以使用Kahn的算法求解CouseSchedule

时间:2019-04-02 11:53:19

标签: python algorithm

我正在学习解决leetcode中的拓扑排序问题

  

您必须参加的课程总数为 n 个,标签为0n-1

     

某些课程可能具有先决条件,例如,要学习课程0,您必须首先学习课程1,该课程以成对表达:[0,1]

     

鉴于课程总数和必备的列表,您有可能完成所有课程吗?

     

示例1:

Input: 2, [[1,0]] 
Output: true
Explanation: There are a total of 2 courses to take. 
             To take course 1 you should have finished course 0. So it is possible.
     

示例2:

Input: 2, [[1,0],[0,1]]
Output: false
Explanation: There are a total of 2 courses to take. 
             To take course 1 you should have finished course 0, and to take course 0 you should
             also have finished course 1. So it is impossible.
     

注意:

     
      
  1. 输入的先决条件是由边列表表示的图形,而不是邻接矩阵。进一步了解how a graph is represented
  2.   
  3. 您可以假设输入的先决条件中没有重复的边。
  4.   

我在讨论区阅读了以下拓扑解决方案

class Solution5:
    def canFinish(self,numCourses, prerequirements):
    """
    :type numCourse: int
    :type prerequirements: List[List[int]]
    :rtype:bool
    """
    if not prerequirements: return True 
    count = []

    in_degrees = defaultdict(int)
    graph = defaultdict(list)

    for u, v in prerequirements:
        graph[v].append(u)
        in_degrees[u] += 1 #Confused here

    queue = [u for u in graph if in_degrees[u]==0]

    while queue:
        s = queue.pop()
        count.append(s)
        for v in graph(s):
            in_degrees[v] -= 1
            if in_degrees[v] ==0:
                queue.append(v)
    #check there exist a circle
    for u in in_degrees:
        if in_degrees[u]:
            return False 
    return True 

我对in_degrees[u] += 1

感到困惑
for u, v in prerequirements:
    graph[v].append(u)
    in_degrees[u] += 1 #Confused here

对于有向边(u,v),u -----> v,节点u具有一个度数,而节点v具有一个度数。

因此,我认为in_degrees[u] += 1应该更改为in_degrees[v] += 1 因为如果存在(u,v),则v至少有一个入射事件和一个度数

  

输入度:仅适用于有向图。这表示进入顶点的边数。

但是,原始解决方案有效。

我的理解有什么问题?

1 个答案:

答案 0 :(得分:1)

看上面的那一行; <div class="background-wrap"> <video id="video-bg-elem" preload="auto" autoplay loop muted="muted" width="100%" height="400" src="https://app.coverr.co/s3/mp4/Over-the-Map.mp4" type="video/mp4"></video> </div>。边缘实际上与您的假设和输入格式相反。这是因为对于拓扑排序,我们希望没有依赖项/输入边的事物最终出现在结果顺序的最前面,因此我们根据解释来定向边,“是要求”而不是“需要”。例如。输入对(0,1)表示0需要1,因此在图形中我们绘制了有向边(1,0),因此在我们的排序中1可以位于0之前。因此,从考虑这对货币对获得0度。