【LeetCode】210. Course Schedule II

来源:互联网 发布:js鼠标移动显示图片 编辑:程序博客网 时间:2024/05/20 06:07

问题描述

在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};
原创粉丝点击