问题描述:我们要学习计算机基础、数学、英语、算法、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]