题目地址
https://leetcode.com/problems/course-schedule-ii/
题目大意
https://leetcode-cn.com/problems/course-schedule-ii
解题思路
有向图的拓扑排序,采用BFS解决。对每组数字,如[1,0], 实际可表示为一条从结点0指向结点1的边,对记录下每个结点的入度数。循环遍历每个结点,如果入度为0,表示没有需要上的课了,push到结果集合中,找不到入度为0的结点,就不需要进行下一次遍历。最后,如果集合中的结点数等于课程数,则返回该集合,否则返回空集合。
C++代码
class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
vector<int> in(numCourses, 0);
vector<int> order;
map<int, vector<int>> adjList;
queue<int> que;
for (vector<int> v : prerequisites) {
in[v[0]]++;
adjList[v[1]].push_back(v[0]);
}
for (int i = 0; i < numCourses; i++) {
if (in[i] == 0) {
que.push(i);
}
}
while(!que.empty()) {
int node = que.front();
que.pop();
order.push_back(node);
if (adjList.count(node)) {
for (auto i : adjList[node]) {
in[i]--;
if (in[i] == 0) {
que.push(i);
}
}
}
}
if (order.size() == numCourses) {
return order;
}
return {};
}
};