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

在这里插入图片描述

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;
    }
};

在这里插入图片描述

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个节点作为根节点

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;
    }
};

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 01:48:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 01:48:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 01:48:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 01:48:04       20 阅读

热门阅读

  1. 1. 小游戏(贪心)

    2023-12-07 01:48:04       40 阅读
  2. C++ 共享内存ShellCode跨进程传输

    2023-12-07 01:48:04       33 阅读
  3. [node]Node.js多线程

    2023-12-07 01:48:04       41 阅读
  4. git的使用:基础配置和命令行

    2023-12-07 01:48:04       42 阅读
  5. 【数据仓库】-- 数据库设计的三个范式

    2023-12-07 01:48:04       43 阅读
  6. 【Linux】统计文件数量:ls -l | grep ^- | wc -l

    2023-12-07 01:48:04       31 阅读
  7. 壹财基金杨振骏:资本如何做好Web3布局?

    2023-12-07 01:48:04       43 阅读
  8. 控制系统设计中的scaled

    2023-12-07 01:48:04       41 阅读
  9. 泛型 (标签)

    2023-12-07 01:48:04       40 阅读
  10. ES6—字符串变化

    2023-12-07 01:48:04       40 阅读
  11. Python中的split()、rsplit()、splitlines()的区别

    2023-12-07 01:48:04       37 阅读