【力扣:207,210,310】拓扑排序

cpp 复制代码
class Solution {
    vector<vector<int>>tmp;
    vector<int>index;
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        tmp.resize(numCourses);
        index.resize(numCourses);
        for(auto&i:prerequisites){
            tmp[i[1]].emplace_back(i[0]);
            index[i[0]]++;
        }
        queue<int>que;
        for(int i=0;i<numCourses;i++){
            if(!index[i]) que.emplace(i);
        }
        int count=0;
        while(!que.empty()){
            count++;
            int n=que.front();
            que.pop();
            for(int i:tmp[n]){
                if(--index[i]==0) que.emplace(i);
            }
        }
        return count>=numCourses;
    }
};
cpp 复制代码
class Solution {
    vector<vector<int>>map;
    vector<int>index;
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        map.resize(numCourses);
        index.resize(numCourses);
        for(auto& i:prerequisites){
            map[i[1]].push_back(i[0]);
            index[i[0]]++;
        }
        vector<int>res;
        for(int i=0;i<numCourses;i++) if(!index[i]) res.push_back(i);
        for(int i=0;i<res.size();i++){
            for(int j:map[res[i]]){
                if(!--index[j]){
                    res.push_back(j);
                }
            }
        }
        if(res.size()<numCourses) return {};
        return res;
    }
};

从叶子节点不断向上拓扑,直到剩下至多2个节点作为根节点

cpp 复制代码
class Solution {
public:
    vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {
        if(n==1) return {0};
        vector<vector<int>>tree(n);
        vector<int>tmp(n);
        for(auto& i:edges){
            tree[i[0]].push_back(i[1]);
            tree[i[1]].push_back(i[0]);
            tmp[i[0]]++;
            tmp[i[1]]++;
        }
        queue<int>que;
        for(int i=0;i<n;i++){
            if(tmp[i]==1) que.push(i);
        }
        for(int cur=n;cur>2;){
            int size=que.size();
            cur-=size;
            while(size--){
                int fr=que.front();
                que.pop();
                for(int i:tree[fr]){
                    if(--tmp[i]==1) que.push(i);
                }
            }
        }
        vector<int>res;
        while(!que.empty()){
            res.push_back(que.front());
            que.pop();
        } 
        return res;
    }
};
相关推荐
通信仿真爱好者3 小时前
第【60期】--大规模MIMO系统信号检测算法误码率比较 --matlab完整代码+参考文章
算法·matlab·mimo·信号检测
AI科技星3 小时前
全域谱分析:无穷维超复数信息场分形统一场论——自然、量子、金融多重分形第一性原理完整体系(中英双语终稿)
人工智能·python·算法·金融·乖乖数学·全域数学
先吃饱再说4 小时前
为什么堆能 O(log n) 插入?拆解完全二叉树的数组魔法
算法·排序算法
留白_4 小时前
【决策树】泰坦尼克号生存预测
算法·决策树·机器学习
hqzing5 小时前
鸿蒙 PC 底层开发技术详解(七):二进制自签名算法的实现
算法·华为·harmonyos
AI科技星5 小时前
超复数全域经济周期场与信息谱场——金融与密码学底层理论重构《0·1·∞三元一体全域超复数统一场论》系列全集(六一字不漏完整合订终版)
人工智能·算法·金融·密码学·拓扑学·乖乖数学·全域数学
AI科技星5 小时前
《01无穷全域信息场论:算子G与宇宙本体高维完备公理大典》
人工智能·python·算法·金融·乖乖数学·全域数学
Tim_105 小时前
【C++】013、空类占多少字节?
算法
Ricky_Theseus5 小时前
并查集:连通性问题
算法
Let's Chat Coding5 小时前
身份识别、身份认证与授权的区别
c++