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;
}
};