• [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;
        }
    };
  • 相关阅读:
    解决Ubuntu 18.04中文输入法的问题,安装搜狗拼音
    POJ 1151 Atlantis 矩形面积求交/线段树扫描线
    [CTF]思维导向图
    Ubuntu Linux 学习篇 配置DHCP服务器
    Ubuntu Linux 学习篇 配置DNS服务器
    Ubuntu Linux DNS服务器 BIND9配置文件命令介绍
    Ubuntu Linux 学习篇 配置DHCP服务器
    Ubuntu Linux 学习篇 配置DNS服务器
    Ubuntu Linux DNS服务器 BIND9配置文件命令介绍
    随记
  • 原文地址:https://www.cnblogs.com/Babylon/p/14602973.html
Copyright © 2020-2023  润新知