方法:拓扑排序—后序遍历+反转

    1. class Solution {
    2. public:
    3. vector<bool> visited,visit;
    4. vector<bool> inpath;
    5. bool iscycle=false;
    6. vector<int> result;
    7. vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
    8. vector<vector<int>>graph= buildgraph(numCourses,prerequisites);
    9. visit.resize(numCourses);
    10. if(check(numCourses,graph)){
    11. return result;
    12. }
    13. for(int i=0;i<numCourses;i++){
    14. travel(i,graph);
    15. }
    16. reverse(result.begin(), result.end());
    17. return result;
    18. }
    19. bool check(int numCourses, vector<vector<int>>& graph){
    20. visited.resize(numCourses);
    21. inpath.resize(numCourses);
    22. for(int i=0;i<numCourses;i++){
    23. dfs(i,graph);
    24. }
    25. return iscycle;
    26. }
    27. vector<vector<int>> buildgraph(int numCourses, vector<vector<int>>& prerequisites){
    28. vector<vector<int>> graph;
    29. graph.resize(numCourses);
    30. for(auto prere:prerequisites){
    31. int from=prere[1];
    32. int to=prere[0];
    33. graph[from].emplace_back(to);
    34. }
    35. return graph;
    36. }
    37. void dfs(int num, vector<vector<int>>& graph){
    38. if(inpath[num]){
    39. iscycle=true;
    40. }
    41. if(visited[num]||iscycle){
    42. return;
    43. }
    44. visited[num]=true;
    45. inpath[num]=true;
    46. for(auto g:graph[num]){
    47. dfs(g,graph);
    48. }
    49. inpath[num]=false;
    50. }
    51. void travel(int num, vector<vector<int>>& graph){
    52. if(visit[num]){
    53. return;
    54. }
    55. visit[num]=true;
    56. for(auto g:graph[num]){
    57. travel(g,graph);
    58. }
    59. result.emplace_back(num);
    60. }
    61. };