问题描述
在207.Course Schedule问题的基础上,求出能够完成所有课程的其中一种可能的顺序方案,如果不存在,则返回空数组。问题就变成:如何按照post值递减来保存节点。
class Solution {
public:
//1、设置计步器,全局变量
int count = 0;
vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<int> result;
if(prerequisites.size() == 0){ //没有边存在时,随便排序都可以
for(int i=0;i<numCourses;i++){
result.push_back(i);
}
return result;
}
//2、建图。
vector<unordered_set<int>> graph(numCourses);
for(auto pre : prerequisites){
graph[pre.second].insert(pre.first);
}
//3、生成(pre, post)值。
vector<pair<int, int>> value(numCourses, make_pair(0, 0));
for(int i=0; i<numCourses; i++){
DFS(graph, value, i);
}
//4、求函数返回值。
for(int v=0; v<numCourses; v++){
for(int u : graph[v]){
if(value[u].first < value[v].first && value[u].second > value[v].second){
return result; //不是return false了
//return false;
}
}
}
for(int i=2*numCourses; i >= 1; i--){ //从最大的post值开始递减遍历
for(int j=0; j<numCourses; j++){ //遍历所有节点,找到post值=i的节点
if(value[j].second == i){ //只看post值,不会看pre值,记得考虑这样一种情况[(0,1),(1,2)]
result.push_back(j);
}
}
}
return result;
//return true;
}//findOrder
//5、DFS函数:对未被访问过的节点进行pre,post值的更新
void DFS(vector<unordered_set<int>>& graph, vector<pair<int, int>>& value, int index){
if(value[index].first == 0){
value[index].first = ++count;
for(auto neigh : graph[index]){
DFS(graph, value, neigh);
}
value[index].second = ++count;
}
}//DFS
};