
示例 2:
输入: 4, [[1,0],[2,0],[3,1],[3,2]]
输出: [0,1,2,3] or [0,2,1,3]
class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
if(numCourses==0)
return {};
vector<vector<int>> edge(numCourses); // 保存边的连接信息
vector<int> index(numCourses); // 保存入度信息
for(int i = 0; i < prerequisites.size(); i++){
// 保存修完课程a, 可以修的其余所有课程
edge[prerequisites[i][1]].push_back(prerequisites[i][0]);
index[prerequisites[i][0]]++; // 入度加一
}
queue<int> q;
for(int i = 0; i < numCourses; i++){
if(index[i]==0)
q.push(i); // 将入度为0的节点加入队列
}
int res = 0;
vector<int> vec;
while(!q.empty()){
vector<int> tmp;
res++;
tmp = edge[q.front()]; // 找到与队列元素指向的所有节点
vec.push_back(q.front()); //
q.pop();
for(int i = 0; i < tmp.size(); i++){
index[tmp[i]]--; // 将与刚才弹出节点相连的节点入度全部减1
if(index[tmp[i]]==0)
q.push(tmp[i]);
}
}
if(res==numCourses)
return vec;
else
return {};
}
};