课程表(拓补排序)

题目链接: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;
    }
};
posted @ 2025-01-11 19:09  Marinaco  阅读(14)  评论(0)    收藏  举报
//雪花飘落效果