题目链接: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;
}
};
标签:压入,int,indegree,入度,numCourses,课程表,排序,拓补
From: https://www.cnblogs.com/benscode/p/18666106