我正在学习解决leetcode中的拓扑排序问题
您必须参加的课程总数为 n 个,标签为
0
至n-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.
注意:
- 输入的先决条件是由边列表表示的图形,而不是邻接矩阵。进一步了解how a graph is represented。
- 您可以假设输入的先决条件中没有重复的边。
我在讨论区阅读了以下拓扑解决方案
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至少有一个入射事件和一个度数
输入度:仅适用于有向图。这表示进入顶点的边数。
但是,原始解决方案有效。
我的理解有什么问题?
答案 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度。