• 广度优先遍历--选课的智慧


    问题描述:我们要学习计算机基础、数学、英语、算法、java五门课,但是学习算法前需要学习java、英语,学Java之前又需要学习数学和计算机基础,那么该如何选课呢?

    具体关系如图所示:

     比如我们要选java,那么我们必须还得选数学和计算机;我们可以直接选英语;

    用二维数组存储课程之间的依赖关系,

    preList=[[0,0,1,0,0],
    [0,0,1,0,0],
    [0,0,0,0,1],
    [0,0,0,0,1],
    [0,0,0,0,0]]

    我们先建立一个数组来存储每门课先修的数量,初始化为0,课程数量为numCourses:

    numCourses=5
    preListCount= [0 for _ in range(numCourses)]
    for line in preList:
        for i in range(len(line)):
            if line[i]==1:
                preListCount[i]+=1
    print(preListCount)
    则课程对应的先修课列表为:
    [0,0,2,0,2]

    接下来,我们建立一个canTake存储当前可以选择的课程,将那些先修课数量为零的加入队列canTake:

    for i in range(len(preListCount)):
        if preListCount[i]==0:
            canTake.append(i)
    print(canTake)
    输出:[0,1,3]

    接下来就可以进行广度优先遍历,

    classTake=[]
    while len(canTake)!=0:
        thisClass=canTake[0]
        del canTake[0]
        classTake.append(thisClass)
        for i in range(numCourses):
            if preList[thisClass][i]==1:
                preListCount[i]-=1
                if preListCount[i]==0:
                    canTake.append(i)
    print(classTake)
    输出:{0,1,3,2,4]
  • 相关阅读:
    c++可调用对象使用示例
    c++ 线程绑定到cpu指定核心
    const在*左边和*右边的区别
    linux c 根据程序名获取进程号
    多线程程序获取进程号和线程号
    虚函数中的默认参数
    ElasticSearch常用查询
    windows10安装windows版Redis
    20220319 14:45:10
    20220320 08:00:06
  • 原文地址:https://www.cnblogs.com/xiximayou/p/11650308.html
Copyright © 2020-2023  润新知