思路
拓扑排序:每次从入度为 0 的结点开始,加入队列。入度为 0 ,表示没有前置结点。处理入度为 0 的结点,把这个结点指向的结点的入度 -1 。再把新的入度为 0 的结点加入队列。如果队列都处理完毕,但是和总结点数不符,说明有些结点形成环。
代码
class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
vector<int> inDeg(numCourses, 0);
vector<vector<int>> lst(numCourses, vector<int>());
for (auto v : prerequisites) {
inDeg[v[0]]++;
lst[v[1]].push_back(v[0]);
}
queue<int> que;
for (auto i = 0; i < inDeg.size(); i++) {
if (inDeg[i] == 0) {
que.push(i);
}
}
vector<int> ans;
while (!que.empty()) {
auto q = que.front();
que.pop();
ans.push_back(q);
for (auto l : lst[q]) {
if (--inDeg[l] == 0) {
que.push(l);
}
}
}
return (ans.size() == numCourses) ? ans : vector<int>();
}
};