LeetCode 207 课程表
你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。
在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]
给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?
示例 1:
输入: 2, [[1,0]]
输出: true
解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。
示例 2:
输入: 2, [[1,0],[0,1]]
输出: false
解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。
拓扑排序~
我用的是 BFS,学过数据结构的应该很清楚这个算法,就是把所有对建一个有向图,然后记录每个点的度数,然后就可以进行 BFS 了~
先把度数为
0
0
0 的点放到队列里,然后开始遍历,每取一个点然后度数减
1
1
1,每次都把度数变为
0
0
0 的点放到队列里,BFS 结束后判断点数是否等于题目点数即可,AC代码如下:
class Solution {
private:
vector<vector<int>> e;
vector<int> d;
public:
bool canFinish(int numCourses, vector<vector<int>> &prerequisites) {
e.resize(numCourses);
d.resize(numCourses);
for (auto i:prerequisites) {
e[i[1]].push_back(i[0]);
d[i[0]]++;
}
queue<int> q;
for (int i = 0; i < numCourses; i++) if (!d[i]) q.push(i);
int num = 0;
while (!q.empty()) {
num++;
int u = q.front();
q.pop();
for (auto v:e[u]) {
d[v]--;
if (!d[v]) q.push(v);
}
}
return num == numCourses;
}
};