题目大意:给出n个课程之间的先修关系,找出一个上课的顺序
分析:拓扑排序,有环就矛盾,没有环就逐个向答案中添加入度为0的结点
代码:
class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> pre(numCourses); //记录每个节点的后续结点
vector<int> degree(numCourses,0); //记录每个结点的入度
for (auto p : prerequisites) {
degree[p[0]]++;
pre[p[1]].push_back(p[0]);
}
queue<int> q; //队列维护入度为0的结点
for(int i = 0;i < numCourses;i++){
if(degree[i] == 0) q.push(i);
}
vector<int> schedule;
while(!q.empty()){
int now = q.front();
q.pop();
schedule.push_back(now);
for(int i = 0;i < pre[now].size();i++){
degree[pre[now][i]]--;
if(degree[pre[now][i]] == 0) q.push(pre[now][i]);
}
}
if(schedule.size() == numCourses) return schedule; //存在一个合理的拓扑排序
else return {};
}
};