【力扣: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;
    }
};
相关推荐
蜡笔小马8 分钟前
10.Boost.Geometry R-tree 空间索引详解
开发语言·c++·算法·r-tree
我是咸鱼不闲呀12 分钟前
力扣Hot100系列20(Java)——[动态规划]总结(下)( 单词拆分,最大递增子序列,乘积最大子数组 ,分割等和子集,最长有效括号)
java·leetcode·动态规划
唐梓航-求职中17 分钟前
编程-技术-算法-leetcode-288. 单词的唯一缩写
算法·leetcode·c#
仟濹18 分钟前
【算法打卡day3 | 2026-02-08 周日 | 算法: BFS】3_卡码网99_计数孤岛_BFS | 4_卡码网100_最大岛屿的面积DFS
算法·深度优先·宽度优先
Ll130452529822 分钟前
Leetcode二叉树part4
算法·leetcode·职场和发展
林开落L22 分钟前
从零开始学习Protobuf(C++实战版)
开发语言·c++·学习·protobuffer·结构化数据序列化机制
林开落L25 分钟前
从入门到了解:Protobuf、JSON、XML 核心解析(C++ 示例)
xml·c++·json·protobuffer·结构化数据序列化机制
Queenie_Charlie29 分钟前
stars(树状数组)
数据结构·c++·树状数组
颜酱31 分钟前
二叉树遍历思维实战
javascript·后端·算法
宝贝儿好33 分钟前
第二章: 图像处理基本操作
算法