leetcode

来源:互联网 发布:孔明棋算法 编辑:程序博客网 时间:2024/06/15 17:25

Question 210–Course Schedule II

题设和Course Schedule一样,只不过要求能完成所有课程时返回一个可行的上课顺序;否则,不能完成所有课程时,返回一个空;

算法

对于[a,b]点对,将b作为边的起始点,a作为边的终点。
用BFS,先将每个点的入度算出来。然后逐渐将入度为0的点去掉,将该点的入度改为-1,并将该点加入要返回的队列中,同时将该点的邻接点的入度减小1。若在所有的点的入度变为-1之前没有入度为0的点,则存在环,返回空。若所有的点的入度都变为了-1,则返回保存的顺序队列。

code

class Solution {public:    vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites){        vector<int> order,degrees(numCourses,0);        queue<int> zerodegree;        //算出每个点的入度         for(auto p: prerequisites){            degrees[p.first]++;        }        //将入度为0的点加入队列         for(int i=0; i<numCourses; i++){            if(!degrees[i]) zerodegree.push(i);        }        int num=0;        while(!zerodegree.empty()){            int zerodegreenode = zerodegree.front();            zerodegree.pop();            degrees[zerodegreenode] = -1;            num++;            order.push_back(zerodegreenode);            for(auto p: prerequisites){                if(p.second==zerodegreenode){                    degrees[p.first]--;                    if(degrees[p.first]==0) zerodegree.push(p.first);                }               }        }        if(num==numCourses) return order;        else return vector<int>();    }};