207. 课程表

  1. [题目链接](207. 课程表 - 力扣(LeetCode))

  2. 解题思路:拓扑排序。有一个可以完成的课程集合set1,有一个需要完成的课程集合set2。每次从set1中拿出一个课程,然后把其影响的节点的入度减减,如果减成了0,则该节点,变成了可以完成的课程,加入set1。依次做下去,如果set2空了,代表全部都完成了,如果set1空了,set2没空,那么就不能完成

  3. 代码

    
    class Solution:
    
        class node:
            def __init__(self, key, pre):
                self.key = key
                self.pre = pre
                self.nexts = set()
    
        def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
            cources = {}
            need_do = set()
            cando = set()
            for cource in prerequisites:
                # cource[0] 就是不能完成的   cource[1]就是可以先完成的
                if cource[0] not in cources:  # 第一次出现这个课程
                    new_cource = self.node(cource[0], 1)
                    cources[cource[0]] = new_cource
                    need_do.add(cource[0])
                else:
                    cources[cource[0]].pre += 1
                    if cource[0] in cando:
                        cando.remove(cource[0])
                        need_do.add(cource[0])
    
                if cource[1] not in cources:
                    new_cource = self.node(cource[1], 0)
                    new_cource.nexts.add(cource[0])
                    cources[cource[1]] = new_cource
                    cando.add(cource[1])
                else:
                    cources[cource[1]].nexts.add(cource[0])
            while cando:
                if not need_do:
                    return True
                cur_cource = cando.pop()
                for next_cource in cources[cur_cource].nexts:
                    cources[next_cource].pre -= 1
                    if cources[next_cource].pre == 0:
                        cando.add(next_cource)
                        need_do.remove(next_cource)
            return not need_do
    
posted @ 2025-01-09 16:21  ouyangxx  阅读(50)  评论(0)    收藏  举报