leetcode-210. 课程表 II
示例 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 {}; } };