青岛oj集训1

2025/3/4

内容:有向无环图(DAG)

优点:DAG有很多良好性质

  1. 拓扑排序

用处:可以根据拓扑序进行dp

这次计算所用的所有边的权值都是有计算过的

一张DAG图肯定有拓扑序(bfs序,dfs序都是拓扑序)

内向树,外向树

因为所有边都是所有从前面指向后面,所以如果一张图可以进行拓扑排序

那么这张图一定是DAG

如果有一张DAG,那么可以对其进行拓扑算法

拓扑算法:求拓扑序

对于一个点u,我们可以求出他的入度d

求入度的办法:枚举每条边u->v,d[v]++;

对于所有的d,必然至少有一个d[n]=0

那么这个(些)点n就可以放在拓扑序的前面.

方法一:

比较简单且愚蠢的方法O(nm)n:点数,m:边数

(就是我用的方法)

一次次遍历整张图

找到入度为0的点,然后把这个点记录下来,并且删掉

一遍遍就能所有点都记录下来

方法二:

首先遍历所有点,找到入度0的点,把它删掉,假设这些点构成一个集合(队列)S

然后从S中找一个点,放在拓扑序的开头

再把这个点"删掉"

其实没必要完全删干净,只需要把这个点所有指向的点入度都--就行了

如果在所有d[v]--的点中,--到0了,那么就把v加到S中

那么这个算法的复杂度:

算入度:O(m)

首次遍历:O(n)

删边:每条边只会被删一边:O(m)

最后时间复杂度是O(m+n)

模板题:B3644