题目链接:https://leetcode.cn/problems/course-schedule-ii/description/
题意:
给定n门课程,规定只有学完某一个课程才能继续学下一门课程,让你输出学习顺序。如果成环,则返回空数组
思路:
拓补排序,入度删除法
需要提前准备一个indegree数组用来统计每个节点的入度大小,
用数组模拟双端队列,先把入度为0的点压入队列,再将这个点的影响消除(即把邻接表中该点的to删除,同时对应到indegree中),如果indegree因此出现为0的点则再次压入,直到压完
如果压入的个数刚好等于节点个数,说明不是环图。
class Solution {
public:vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {vector<int>gra[2005];vector<int>indegree(numCourses);for(int i=0;i<prerequisites.size();i++){int from=prerequisites[i][1];int to=prerequisites[i][0];indegree[to]++;gra[from].emplace_back(to);}vector<int> qu;int l=0,r=0;for(int i=0;i<numCourses;i++){if(indegree[i]==0){qu.emplace_back(i);r++;}}int cnt=0;while(l<r){int cur=qu[l++];cnt++;for(int next:gra[cur]){if(--indegree[next]==0){qu.emplace_back(next);r++;}}}vector<int>em;return cnt==numCourses? qu:em;}
};