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>();
}
};