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 @   ouyangxx  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示