拓扑排序

拓扑排序-总结

母题

给定一个 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。

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

posted @ 2024-09-24 16:04  wscqwq  阅读(3)  评论(0编辑  收藏  举报