解题思路:
- 可以参考https://blog.csdn.net/jhb1021821368/article/details/118863116这个题,只不过本题要求对图进行拓扑排序,这里多加了一个模拟的栈结构,在栈底下存储深度优先搜索的最深结点
class Solution {
private:
// 存储有向图
vector<vector<int>>edges;
// 存储结点的状态0表示未搜索,1表示正在搜索,2表示搜索完成
vector<int>visitied;
// 存储图的拓扑结构,其中0索引存的是最深的结点
vector<int>result;
// 存储是没有环
bool valid = true;
public:
void dfs(int u){
visitied[u]=1;
for(int v : edges[u]){
if(visitied[v]==0){
dfs(v);
if(!valid){
return;
}
}else if(visitied[v]==1){
valid = false;
return;
}
}
visitied[u]=2;
result.push_back(u);
}
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
edges.resize(numCourses);
visitied.resize(numCourses);
for(const auto& temp : prerequisites){
edges[temp[1]].push_back(temp[0]);
}
// 从0开始进行搜索,要求目前为止还没有出现环
for(int i = 0;i<numCourses && valid;++i){
if(!visitied[i]){
dfs(i);
}
}
if(!valid){
return {};
}
reverse(result.begin(),result.end());
return result;
}
};