这道题要求拓扑排序,返回合法的序列,用不停删除入度为0的点的方法做。注意,stack来存储需要处理的入度为0的点,vector<int> sorted存储结果。
class Solution {
public:
vector<int> findOrder(int numCourses, vector<pair<int, int> >& prerequisites) {
int degree[numCourses] = {0};
vector<vector<int> > matrix(numCourses);
for(int i = 0; i < prerequisites.size(); i++){
matrix[prerequisites[i].second].push_back(prerequisites[i].first);
degree[prerequisites[i].first]++;
}
vector<int> sorted;
stack<int> q;
for(int i = 0; i < numCourses; i++)
if(degree[i] == 0){
q.push(i);
sorted.push_back(i);
}
while(!q.empty()){
int d = q.top();
q.pop();
for(int i = 0; i < matrix[d].size(); i++){
degree[matrix[d][i]]--;
if(degree[matrix[d][i]] == 0){
q.push(matrix[d][i]);
sorted.push_back(matrix[d][i]);
}
}
}
for(int i = 0; i < numCourses; i++)
if(degree[i] != 0){ //做完拓扑排序还有入度不为0的点,则有环存在,图不合法
sorted.clear(); break;
}
return sorted;
}
};