背景
拓扑排序旨在解决有依赖关系的图排序,比如大学排课,先上A课才能上B课,等等这样一系列的依赖顺序,问给出规划一条完整的上课顺序.
基本思路就是在图关系中找到入度为0的节点,然后将这个节点从图中删除,以此往复,直到结束。
可能会出现问题的地方:如果图中有环,就没有办法找出下一个节点了,因为没有节点入度为0,这也就是说为何拓扑排序可以判断图中有没有环。
需要判断是不是环的话,在最后加一个判断看ans的大小是否等于节点数即可
例题
210. 课程表 II - 力扣(LeetCode)https://leetcode.cn/problems/course-schedule-ii/description/
代码实现
class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
int n=prerequisites.size();
vector<int> inDegrees(numCourses,0);
vector<vector<int>> edges(numCourses,vector<int>(0));
vector<int> ans;
for(int i=0;i<n;i++)
{
int first=prerequisites[i][0];
int second=prerequisites[i][1];
inDegrees[first]++;
edges[second].push_back(first);
}
while(1)
{
int mark=0;
for(int i=0;i<inDegrees.size();i++)
{
if(inDegrees[i]==0)
{
mark=1;
for(int j=0;j<edges[i].size();j++)
{
inDegrees[edges[i][j]]--;
}
ans.push_back(i);
inDegrees[i]=-1;
}
}
//在一轮里边没找到新的
if(mark==0) break;
}
if(ans.size()!=numCourses) return vector<int>();
return ans;
}
};