方法:拓扑排序—后序遍历+反转
class Solution {public:vector<bool> visited,visit;vector<bool> inpath;bool iscycle=false;vector<int> result;vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {vector<vector<int>>graph= buildgraph(numCourses,prerequisites);visit.resize(numCourses);if(check(numCourses,graph)){return result;}for(int i=0;i<numCourses;i++){travel(i,graph);}reverse(result.begin(), result.end());return result;}bool check(int numCourses, vector<vector<int>>& graph){visited.resize(numCourses);inpath.resize(numCourses);for(int i=0;i<numCourses;i++){dfs(i,graph);}return iscycle;}vector<vector<int>> buildgraph(int numCourses, vector<vector<int>>& prerequisites){vector<vector<int>> graph;graph.resize(numCourses);for(auto prere:prerequisites){int from=prere[1];int to=prere[0];graph[from].emplace_back(to);}return graph;}void dfs(int num, vector<vector<int>>& graph){if(inpath[num]){iscycle=true;}if(visited[num]||iscycle){return;}visited[num]=true;inpath[num]=true;for(auto g:graph[num]){dfs(g,graph);}inpath[num]=false;}void travel(int num, vector<vector<int>>& graph){if(visit[num]){return;}visit[num]=true;for(auto g:graph[num]){travel(g,graph);}result.emplace_back(num);}};
