# 存储课程的先行和后继关系 # 前驱课程集合 pre = {} # 后继课程集合 succ = {} # 输入课程数量和课程信息 n = int(input("输入课程数量:")) # 课程名称列表 courses = [] for i in range(n): course_name = input(f"输入第{i + 1}门课程名:") courses.append(course_name) pre_courses = input(f"{course_name}的先行课程(以空格分隔):") if pre_courses: pre_courses = pre_courses.split() pre[course_name] = set(pre_courses) for pre_course in pre_courses: if pre_course not in succ: succ[pre_course] = set() succ[pre_course].add(course_name) # 拓扑排序 # 从没有先行课程的课程开始 q = [course for course in courses if course not in pre] # 保存拓扑排序的结果 res = [] while q: # 从队列中取出一个课程 curr_course = q.pop(0) # 将该课程加入结果中 res.append(curr_course) # 遍历该课程的后继课程 if curr_course in succ: for succ_course in succ[curr_course]: # 将该课程的后继课程的先行课程集合中删除该课程 pre[succ_course].remove(curr_course) # 如果该课程的后继课程没有先行课程,则将其加入队列 if not pre[succ_course]: q.append(succ_course) # 如果存在回路,则输出错误提示信息 if len(res) != n: print("错误提示:存在回路关系!请检查输入。") else: print("安排教学计划的序列为:", " -> ".join(res))请详细注释一下该段代码
时间: 2024-02-26 07:57:10 浏览: 197
这段代码实现了一个课程拓扑排序的算法,来解决如何安排教学计划的问题。以下是代码的详细解释:
```
# 存储课程的先行和后继关系
# 前驱课程集合 pre = {}
# 后继课程集合 succ = {}
```
定义了两个字典变量 pre 和 succ,用于存储每个课程的先行课程和后继课程。
```
# 输入课程数量和课程信息
n = int(input("输入课程数量:"))
# 课程名称列表 courses = []
for i in range(n):
course_name = input(f"输入第{i + 1}门课程名:")
courses.append(course_name)
pre_courses = input(f"{course_name}的先行课程(以空格分隔):")
if pre_courses:
pre_courses = pre_courses.split()
pre[course_name] = set(pre_courses)
for pre_course in pre_courses:
if pre_course not in succ:
succ[pre_course] = set()
succ[pre_course].add(course_name)
```
通过用户输入,构建了课程名称列表 courses,同时在 pre 和 succ 中记录每个课程的先行课程和后继课程。这里使用了集合来存储先行课程和后继课程,可以方便地进行添加和删除操作。
```
# 拓扑排序
# 从没有先行课程的课程开始
q = [course for course in courses if course not in pre]
# 保存拓扑排序的结果
res = []
while q:
# 从队列中取出一个课程
curr_course = q.pop(0)
# 将该课程加入结果中
res.append(curr_course)
# 遍历该课程的后继课程
if curr_course in succ:
for succ_course in succ[curr_course]:
# 将该课程的后继课程的先行课程集合中删除该课程
pre[succ_course].remove(curr_course)
# 如果该课程的后继课程没有先行课程,则将其加入队列
if not pre[succ_course]:
q.append(succ_course)
```
在拓扑排序过程中,从没有先行课程的课程开始,依次处理每个课程的后继课程。具体来说:
1. 从队列 q 中取出一个课程 curr_course,将其加入结果 res 中;
2. 遍历该课程 curr_course 的后继课程 succ_course;
3. 将该课程 curr_course 从 succ_course 的先行课程集合 pre[succ_course] 中删除;
4. 如果该课程 succ_course 没有其他先行课程,则将其加入队列 q 中,以便下一轮处理。
```
# 如果存在回路,则输出错误提示信息
if len(res) != n:
print("错误提示:存在回路关系!请检查输入。")
else:
print("安排教学计划的序列为:", " -> ".join(res))
```
最后,判断是否存在回路关系。如果存在,则输出错误提示信息;否则,输出安排教学计划的结果。
阅读全文
相关推荐


















