当前位置: 首页 > news >正文

[图论]拓扑排序

[leetcode]210. 课程表 II
题目链接
开始刷拓扑排序的题了 发现没写过拓扑排序的blog
补一个

拓扑排序适用于有向无环图DAG,可以用来判断有没有环

题意

  • 现在你总共有 n 门课需要选,记为 0 到 n − 1 n - 1 n1
  • 给你一个数组 grid ,其中 g r i d [ i ] = [ a i , b i ] grid[i] = [a_i, b_i] grid[i]=[ai,bi] ,表示在选修课程 a i a_i ai 前 必须 先选修 b i b_i bi
    这里是 [ t o , f r o m ] [to,from] [to,from] 我们先把它反过来 符合习惯
  • 返回一个学习顺序的vector

思想

  • 统计每个点的入度d[i]
  • 初始入度为0 的入队
  • 类似bfs的操作
  • 每次取出队头
  • 通过队头扩展,删除队头指向的其他邻接点
  • 邻接点的入度-1,如果入度变成0,就入队
  • 最后通过是否所有点都入队来判断是否无环

模板

const int N=2010;
vector<int>g[N];
int d[N],q[N],n;

bool topsort(){
    int hh=0,tt=-1;
    for(int i=0;i<n;i++){
        if(d[i]==0) q[++tt]=i;
    }

    while(hh<=tt){
        int t=q[hh++];
        for(int i:g[t]){
            if(--d[i]==0){
                q[++tt]=i;
            }
        }
    }
    return tt==n-1;//tt表示队列长度
}

int main(){
    for(int i=1;i<=n;i++){
        for(int j:g[i]){
            d[j]++;
        }
    }
}

Code

class Solution {
public:
    vector<int> findOrder(int n, vector<vector<int>>& grid) {
        vector<int>d(n);
        vector<vector<int>>g(n);
        for(auto e:grid){
            int u=e[0],v=e[1];
            g[v].emplace_back(u);
            d[u]++;
        }

        vector<int>q(n);//数组模拟队列
        int hh=0,tt=-1;//hh队头,tt队尾
        for(int i=0;i<n;i++){
            if(d[i]==0){
                q[++tt]=i;
            }
        }

        while(hh<=tt){
            int t=q[hh++];//取出队头
            for(int i:g[t]){
                if(--d[i]==0){
                    q[++tt]=i;
                }
            }
        }
        if(tt!=n-1) return {};
        return q;
    }
};

文章转载自:
http://alamode.apjjykv.cn
http://bobotie.apjjykv.cn
http://balladize.apjjykv.cn
http://cephaloid.apjjykv.cn
http://antifertility.apjjykv.cn
http://belize.apjjykv.cn
http://bumph.apjjykv.cn
http://anemometer.apjjykv.cn
http://bannister.apjjykv.cn
http://allozyme.apjjykv.cn
http://carrie.apjjykv.cn
http://breast.apjjykv.cn
http://ague.apjjykv.cn
http://adapter.apjjykv.cn
http://bourn.apjjykv.cn
http://bereavement.apjjykv.cn
http://arrant.apjjykv.cn
http://bisect.apjjykv.cn
http://blimey.apjjykv.cn
http://abolition.apjjykv.cn
http://alsorunner.apjjykv.cn
http://altitudinal.apjjykv.cn
http://aftermentioned.apjjykv.cn
http://alkyl.apjjykv.cn
http://brule.apjjykv.cn
http://chryselephantine.apjjykv.cn
http://acoustics.apjjykv.cn
http://antitrinitarian.apjjykv.cn
http://absolve.apjjykv.cn
http://bibliomaniacal.apjjykv.cn
http://www.dtcms.com/a/105362.html

相关文章:

  • 【JavaEE】MyBatis - Plus
  • deepseek v3-0324 化学键线式Canvas编辑器设计
  • 线程池自顶向下
  • 关于 @Autowired 和 @Value 使用 private 字段的警告问题分析与解决方案
  • # C++初阶——内存管理
  • 【mysql】日志:binLog、redoLog和undoLog
  • openwebui和keycloak集成,使用keycloak的用户名和密码登录
  • Ubuntu 安全限制遭突破:攻击者可利用内核漏洞提权
  • 如何使用AI去水印(ChatGPT去除图片水印)
  • Proxmox pct 部署debian
  • Elasticsearch安全加固指南:启用登录认证与SSL加密
  • Linux服务器组建与管理
  • 使用 Selenium 构建简单高效的网页爬虫
  • 4.1 代码随想录第三十二天打卡
  • ​Android 集成 Facebook 登录
  • 2025.4.6机器学习笔记:文献阅读
  • AI与.NET技术实操系列(四):使用 Semantic Kernel 和 DeepSeek 构建AI应用
  • Sink Token
  • Java关于抽象类和抽象方法
  • 使用Python解析PPT文件并生成JSON结构详解
  • 25 python 迭代器与生成器
  • 教你快速理解linux中的NUMA节点探测是干什么用的?
  • 配置多区域集成IS-IS和抓包分析
  • Python 机器学习库:Scikit-learn
  • Mysql之事务(上)
  • 后端思维之高并发处理方案
  • AI日报 - 2025年4月2日
  • 汇编学习之《test, cmp 指令》
  • vscode中的【粘滞滚动】的基本概念和作用,关闭了以后如何开启
  • 蚂蚁集团医疗AI战略启示:国产算力驱动下的医疗生态重构与场景深耕