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

1.5 KiB
Raw Blame History

拓扑排序指的是一种 解决问题的大体思路, 而具体算法,可能是 广搜 可能是深搜。

大家可能发现 各式各样的解法,纠结哪个是拓扑排序?

只要能在把 有向无环图 进行线性排序 的算法 都可以叫做 拓扑排序。

引用与任务调度,课程安排等等。

为什么


「拓扑排序」是专门应用于有向图的算法;

把一个 有向无环图 转成 线性的排序 就叫 拓扑排序。

拓扑排序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;