首页 > 其他分享 >拓扑排序

拓扑排序

时间:2024-09-24 16:02:34浏览次数:4  
标签:拓扑 DP 排序 节点 按照 AcWing

拓扑排序-总结

母题

给定一个 DAG(有向无环图),如果从 \(u\) 到 \(v\) 有边,则认为 \(v\) 依赖于 \(u\)。如果 \(u\) 到 \(v\) 有路径(\(u\) 可达 \(v\)),则称 \(v\) 间接依赖于 \(u\)。我们将图中的顶点以线性方式进行排序,使得对于任何的顶点 \(u\) 到 \(v\) 的有向边 \((u,v)\),都可以有 \(u\) 在 \(v\) 的前面。

拓扑排序的目标是将所有节点排序,使得排在前面的节点不能依赖于排在后面的节点。

例题

https://www.luogu.com.cn/problem/B3644

https://www.luogu.com.cn/record/178163992

习题

福建省历届夏令营-排序

核心思路是对于每次操作都进行一次拓扑排序,然后看是否出现循环依赖或者无法确定(即 \(\max qsize>1\))。

Minimum Longest Trip G

拓扑排序求最长路,然后进行分层,按照拓扑排序的逆序操作进行第二次DP即可。

[CSP-S2020] 函数调用

本质上函数的嵌套调用就是一个DAG,利用拓扑排序考虑 addmul 运算即可。考虑母子节点的计算关系。

AcWing 164. 可达性统计

还是利用拓扑排序的逆序DP,每个位置 \(dp_{i,j}\) 记录 \(i\) 到 \(j\) 是否可达。利用 bitset按位或优化32倍常数。

[AcWing 477. 神经网络](AcWing 477. 神经网络)

直接按照要求按照拓扑序计算。

车站分级

考察虚拟节点优化 \(O(n^2)\) 建边 ->\(O(n)\)。

总结

总体分两类:

  1. 按照拓扑序计算答案。
  2. 按照逆拓扑序计算答案。

可能要做多次,或者像函数调用这样抽象,然后重点考察如何合并信息。也可以与其他数据结构,如 bitset 一起使用。或者同时运用两类方法进行DP。

边数过多可以考虑车站分级做法。

标签:拓扑,DP,排序,节点,按照,AcWing
From: https://www.cnblogs.com/wscqwq/p/18429330

相关文章

  • 福建省历届夏令营-排序
    https://www.luogu.com.cn/problem/P1347特殊情况很烦。如果出现条件\(A<A\),矛盾;然后我们每次加入一条新的边,就重新做拓扑排序,记为函数topo()。如果topo()\(=i\),表示总进队次数为\(i\)。由于要唯一确定,所以如果出现某一个时刻队列长度超过\(1\),就说明这两个点是平级的关......
  • MySQL零基础入门教程-4 查询数据排序,基础+实战
    教程来源:B站视频BV1Vy4y1z7EX001-数据库概述_哔哩哔哩_bilibili我听课收集整理的课程的完整笔记,供大家学习交流下载:夸克网盘分享本文内容为完整笔记的第四篇15、排序P26-2915.1、查询所有员工薪资,排序?orderby默认升序编辑15.2怎么降序-desc 怎么升序-ascdesc(descond)指定降序......
  • 【数据结构和算法实践-排序-归并排序】
    数据结构和算法实践-排序-归并排序题目MyThought代码示例JAVA-8题目排序MyThought然后再进行递归,递归要注意两个方面:一、自我调用二、终止条件:即函数边界注意点:树、递归*代码示例JAVA-8publicclassMergeSort{publicstaticvoidmergeSor......
  • 归并排序
    选择排序......定义归并排序(mergesort)是高效的基于比较的稳定排序算法。性质归并排序基于分治思想将数组分段排序后合并,时间复杂度在最优、最坏与平均情况下均为O(nlogn),空间复杂度为O(n)。归并排序可以只使用O(1)的辅助空间,但为便捷通常使用与原数组等长的辅助......
  • 选择排序
    选择排序......定义选择排序(Selectionsort)是一种简单直观的排序算法。它的工作原理是每次找出第i小的元素(也就是A{i..n}中最小的元素),然后将这个元素与数组第i个位置上的元素交换。稳定性由于swap(交换两个元素)操作的存在,选择排序是一种不稳定的排序算法。时间复......
  • 冒泡排序
    冒泡排序......定义冒泡排序(Bubblesort)是一种简单的排序算法。由于在算法的执行过程中,较小的元素像是气泡般慢慢「浮」到数列的顶端,故叫做冒泡排序。过程它的工作原理是每次检查相邻两个元素,如果前面的元素与后面的元素满足给定的排序条件,就将相邻两个元素交换。当没有......
  • 数据结构之线性表——LeetCode:82. 删除排序链表中的重复元素 II,21. 合并两个有序链
    82.删除排序链表中的重复元素II题目描述82.删除排序链表中的重复元素II给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。运行代码classSolution{public:ListNode*deleteDuplicates(ListNode......
  • Java-数据结构-排序-(二) (๑¯∀¯๑)
    文本目录:❄️一、交换排序:    ➷ 1、冒泡排序:    ▶代码:     ➷ 2、快速排序:          ☞基本思想:          ☞方法一:Hoare法    ▶代码:           ☞方法二:挖坑法  ......
  • 冒泡排序
    publicclassArraysDemo01{publicstaticvoidmain(String[]args){//冒泡排序//比较数组中,两个相邻的元素,如果第一个比第二个数大,调换位置//每一次比较,都会产生一个最大或者最小的数//下一轮可以少一次排序intar[]={1,212,6,9,12,88,2,22};System.out.println(Arrays......
  • 冒泡排序、选择排序、插入排序 - JavaScript 中的数据结构和算法
    排序算法是许多计算任务的支柱,在组织数据以实现高效访问和处理方面发挥着至关重要的作用。无论您是刚刚开始探索算法世界的初学者,还是希望刷新知识的经验丰富的开发人员,了解这些基本排序技术都是至关重要的。在这篇文章中,我们将探讨一些更基本的排序算法-冒泡排序、选择排序和插......