Files
leetcode-master/problems/0207.课程表.md
programmercarl c25c409c50 Update
2024-04-02 16:55:47 +08:00

52 lines
1.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

拓扑排序指的是一种 解决问题的大体思路, 而具体算法,可能是 广搜 可能是深搜。
大家可能发现 各式各样的解法,纠结哪个是拓扑排序?
只要能在把 有向无环图 进行线性排序 的算法 都可以叫做 拓扑排序。
引用与任务调度,课程安排等等。
为什么
-----
「拓扑排序」是专门应用于有向图的算法;
把一个 有向无环图 转成 线性的排序 就叫 拓扑排序。
拓扑排序Kahn 算法,其实就是广度优先遍历的思路)
这道题的做法同样适用于第 210 题。
------------------
```
vector<int> inDegree(numCourses);
unordered_map<int, vector<int>> map;
for (int i = 0; i < prerequisites.size(); i++) {
inDegree[prerequisites[i][0]]++;//当前课程入度值+1
map[prerequisites[i][1]].push_back(prerequisites[i][0]);//添加依赖他的后续课
}
queue<int> Qu;
for (int i = 0; i < numCourses; i++) {
if (inDegree[i] == 0) Qu.push(i);//所有入度为0的课入列
}
int count = 0;
while (Qu.size()) {
int selected = Qu.front(); //当前选的课
Qu.pop();//出列
count++;//选课数+1
vector<int> toEnQueue = map[selected];//获取这门课对应的后续课
if (toEnQueue.size()) { //确实有后续课
for (int i = 0; i < toEnQueue.size(); i++) {
inDegree[toEnQueue[i]]--; //依赖它的后续课的入度-1
if (inDegree[toEnQueue[i]] == 0) Qu.push(toEnQueue[i]); //如果因此减为0入列
}
}
}
if (count == numCourses) return true;
return false;
```