拓扑排序:检查图中是否有环,没有环返回排序后的结果,有环返回空数组
1. 先记录每个顶点的入度
2. 寻找入度为0的点,然后去掉所有以该顶点为入度的点的入度,循环执行此步骤
3. 当队列为空时,即找不到一个入度为0的点时,退出循环,如果数组中所有点的入度都为0说明能顺利学习,否则不行,返回结果
class Solution {
public:
/*拓扑排序*/
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
vector<int> result;
// 先记录每个顶点的入度
vector<int> points(numCourses,0);
for(auto p:prerequisites){
points[p[0]]++;
}
// 寻找入度为0的点,然后去掉所有以该顶点为入度的点的入度
// 广度优先遍历 ,使用队列记录入度为0的点
queue<int> zone;
for(int i=0;i<numCourses;i++){
if(points[i]==0){
zone.push(i);
}
}
// 当队列为空时,即找不到一个入度为0的点时,退出循环,如果数组中所有点的入度都为0说明能顺利学习,否则不行
while(!zone.empty()){
// 从队列中取出一个点,将与这个点相连的边去掉
int p = zone.front();
zone.pop();
result.emplace_back(p);
for(auto pre:prerequisites){
if(pre[1]==p){
points[pre[0]]--;
if(points[pre[0]] == 0){
zone.push(pre[0]);
}
}
}
}
for(auto p:points){
if(p!=0){
result.clear();
}
}
return result;
}
};