leetcode210. 课程表 II

//https://leetcode.cn/problems/course-schedule-ii/
const int N=2e3+10,M=N*(N-1);
class Solution {
private:
    int n,m;
    int head[N],Next[M],to[M],cnt;
    int indegree[N];
    int h,t;
    int q[N];
    vector<int> ans;
    void build(){
        cnt=1;
        h=t=0;
        memset(head,0,sizeof head);
        memset(indegree,0,sizeof indegree);
    }
    void addEdge(int u,int v){
        Next[cnt]=head[u];
        to[cnt]=v;
        head[u]=cnt++;
    }
    bool topoSort(){
        for(int i=0;i<n;i++) if(indegree[i]==0) q[t++]=i;
        int fill=0;
        while(h<t){
            int u=q[h++];
            ans.push_back(u);
            fill++;
            for(int ei=head[u],v;ei;ei=Next[ei]){
                v=to[ei];
                if(--indegree[v]==0) q[t++]=v;
            }
        }
        return fill==n;
    }
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        n=numCourses,m=prerequisites.size();
        build();
        for(int i=0,u,v;i<m;i++){
            indegree[prerequisites[i][0]]++;
            addEdge(prerequisites[i][1],prerequisites[i][0]);
        }
        if(!topoSort()) ans.clear();
        return ans;
    }
};
posted @ 2025-05-01 17:40  九三青梧  阅读(8)  评论(0)    收藏  举报