210. 课程表 II - 力扣(LeetCode)
这是一道拓扑排序的模板题。简单来说,给出一个有向图,把这个有向图转成线性的排序就叫拓扑排序。如果有向图中有环就没有办法进行拓扑排序了。因此,拓扑排序也是图论中判断有向无环图的方法。
用bfs的拓扑排序思路如下:1.找到入度为0的节点,加入结果集;2.将该节点从图中移除
需要注意三点:1.移除不是真的移除,只不过是把与这个节点相连的节点的入度减一;2.如果一个节点与两个或以上个节点相连,那么在移除了这个节点之后就会有多个选择,因此拓扑排序的结果不唯一;3.如果结果集的元素个数不等于图中节点个数,那么就必定有环。
class Solution
{
public:vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {int n=numCourses;vector<vector<int>>graph(n);//图vector<int>ans;//结果集vector<int>inDegree(n,0);//记录入度的数组for(auto&p:prerequisites)//构建图{graph[p[1]].push_back(p[0]);inDegree[p[0]]++;}queue<int>que;for(int i=0;i<n;i++)//将入度为0的节点加入队列{if(inDegree[i]==0){que.push(i);}}while(!que.empty()){int fro=que.front();que.pop();ans.push_back(fro);//加入结果集for(int x:graph[fro])//处理节点fro指向的节点{inDegree[x]--;if(inDegree[x]==0){que.push(x);}}}if(ans.size()!=n){return {};}return ans;}
};