拓扑排序-总结
母题
给定一个 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,利用拓扑排序考虑 add
和 mul
运算即可。考虑母子节点的计算关系。
AcWing 164. 可达性统计
还是利用拓扑排序的逆序DP,每个位置 \(dp_{i,j}\) 记录 \(i\) 到 \(j\) 是否可达。利用 bitset
的按位或优化32倍常数。
[AcWing 477. 神经网络](AcWing 477. 神经网络)
直接按照要求按照拓扑序计算。
车站分级
考察虚拟节点优化 \(O(n^2)\) 建边 ->\(O(n)\)。
总结
总体分两类:
- 按照拓扑序计算答案。
- 按照逆拓扑序计算答案。
可能要做多次,或者像函数调用这样抽象,然后重点考察如何合并信息。也可以与其他数据结构,如 bitset
一起使用。或者同时运用两类方法进行DP。
边数过多可以考虑车站分级做法。
标签:拓扑,DP,排序,节点,按照,AcWing From: https://www.cnblogs.com/wscqwq/p/18429330