[LeetCode] 207&210&310. Course Schedule

判断一个图是否有环

https://www.cnblogs.com/tenosdoit/p/3644225.html

拓扑排序

https://www.cnblogs.com/nycsde/p/13683163.html

https://www.cxyxiaowu.com/1084.html

题解

https://www.cnblogs.com/grandyang/p/4484571.html

 207

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
            if(numCourses<2||prerequisites.size()<2){
                return true;
            }
            vector<vector<int>> graph(numCourses, vector<int>());
            //入度个数
            vector<int> in(numCourses);
            //初始化为有向邻接表
            for (auto a : prerequisites) {
                graph[a[1]].push_back(a[0]);
                ++in[a[0]];
            }
            //directed acycle graph,这里不用存
            queue<int> dag;
            //将入度为0的加入dag
            for(int i=0;i<numCourses;++i){
                if (in[i] == 0) dag.push(i);
            }
            int tmp;
            while(!dag.empty()){
                tmp=dag.front();//取出第一个
                dag.pop();//从dag中删除第一个
                for(auto a : graph[tmp]){
                    --in[a];
                    if(in[a]==0){
                        dag.push(a);
                    }
                }
            }
            //还有入度大于0的则有环
            for(int i=0;i<numCourses;++i){
                if (in[i] >0) return false;
            }
            return true;
    }
};

 210

class Solution {
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
            vector<int> dag;
            if(numCourses<2){
                dag.push_back(0);
                return dag;
            }
            vector<vector<int>> graph(numCourses, vector<int>());
            //入度个数
            vector<int> in(numCourses);
            //初始化为有向邻接表
            for (auto a : prerequisites) {
                graph[a[1]].push_back(a[0]);
                ++in[a[0]];
            }
            //directed acycle graph,这里不用存
            
            queue<int> q;
            //将入度为0的加入dag
            for(int i=0;i<numCourses;++i){
                if (in[i] == 0) {
                    q.push(i);
                }
            }
            int tmp;
            while(!q.empty()){
                tmp=q.front();//取出第一个
                dag.push_back(tmp);
                q.pop();//从dag中删除第一个
                for(auto a : graph[tmp]){
                    --in[a];
                    if(in[a]==0){
                        q.push(a);
                    }
                }
            }
            //dag元素个数不等于图中顶点个数则有环
            if (dag.size() != numCourses) dag.clear();
            return dag;
    }
};

 310

class Solution {
//取剩下小于等于2时的节点
public:
    vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {
            if (n == 1) return {0};
            vector<vector<int>> graph(n, vector<int>());
            //入度个数
            vector<int> in(n);
            //初始化为有向邻接表
            for (auto a : edges) {
                graph[a[1]].push_back(a[0]);
                graph[a[0]].push_back(a[1]);
                ++in[a[0]];
                ++in[a[1]];
            }
            //directed acycle graph,这里不用存
            
            queue<int> q;
            //将入度为0的加入dag
            for(int i=0;i<n;++i){
                if (in[i] == 1) {
                    q.push(i);
                }
            }
            int tmp;
            vector<int> dag;
            int len;
            while(n>2){
                len=q.size();
                n-=len;
                for(int i=0;i<len;++i){
                    tmp=q.front();//取出第一个
                    q.pop();//从dag中删除第一个
                    for(auto a : graph[tmp]){
                        --in[a];
                        if(in[a]==1){
                            q.push(a);
                        }
                    }
                }
                
            }
            while(!q.empty()){
                dag.push_back(q.front());
                q.pop();
            }
            return dag;
    }
};

 

posted @ 2021-03-31 18:03  巴啦啦大魔王  阅读(46)  评论(0编辑  收藏  举报