leetcode-210. 课程表 II

 

示例 2:

输入: 4, [[1,0],[2,0],[3,1],[3,2]]
输出: [0,1,2,3] or [0,2,1,3]

 

class Solution {
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {

        if(numCourses==0)
            return {};

        vector<vector<int>> edge(numCourses);  // 保存边的连接信息
        vector<int> index(numCourses);  // 保存入度信息

        for(int i = 0; i < prerequisites.size(); i++){
            // 保存修完课程a, 可以修的其余所有课程
            edge[prerequisites[i][1]].push_back(prerequisites[i][0]);
            index[prerequisites[i][0]]++;  // 入度加一
        }

        queue<int> q;
        for(int i = 0; i < numCourses; i++){
            if(index[i]==0)
                q.push(i);  // 将入度为0的节点加入队列
        }

        int res = 0;
        vector<int> vec;
        while(!q.empty()){
            vector<int> tmp;
            res++;
            tmp = edge[q.front()];  // 找到与队列元素指向的所有节点
            vec.push_back(q.front());   // 
            q.pop();
            for(int i = 0; i < tmp.size(); i++){
                index[tmp[i]]--; // 将与刚才弹出节点相连的节点入度全部减1
                if(index[tmp[i]]==0)
                    q.push(tmp[i]);
            } 
        }

        if(res==numCourses)
            return vec;
        else 
            return {};
    }
};

 



 

posted @ 2021-09-18 15:19  三一一一317  阅读(79)  评论(0)    收藏  举报