首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >广度优先遍历--选课的智慧

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

作者头像
西西嘛呦
发布2020-08-26 10:11:45
发布2020-08-26 10:11:45
42700
代码可运行
举报
运行总次数:0
代码可运行

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

具体关系如图所示:

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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:

代码语言:javascript
代码运行次数:0
运行
复制
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:

代码语言:javascript
代码运行次数:0
运行
复制
for i in range(len(preListCount)):
    if preListCount[i]==0:
        canTake.append(i)
print(canTake)
输出:[0,1,3]

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

代码语言:javascript
代码运行次数:0
运行
复制
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]
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档