2025/3/4
内容:有向无环图(DAG)
优点:DAG有很多良好性质
- 拓扑排序

用处:可以根据拓扑序进行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