拓扑排序
定义
拓扑排序,是对有向无环图(DAG)的一种操作,把有向无环图按一定顺序排成一个线性序列。
例如这张图,将此图排为1-2-3
排序方法
首先找出所有入度为0的点。
将他们放入优先队列,并把每个点的所有后继的入度全部减一,相当于将此点于图中删除。
之后遍历队列,每次将队头点的所有后继遍历。
若后继入度为0,则将后继入队,直到队空为止。
序列不唯一
对于一个有向无环图,排出的序列可能不止一个。
例如:
这个DAG拓扑序列可以是1-2-4-3,也可以是1-4-2-3
例题
一、是否合法
题目描述
给定n个节点和m个有向边,判断此图是否有环。
思路
若一个图有环,则环内所有节点在经过拓扑排序后必然不会被遍历到。
因此可以通过拓扑排序排出一个序列,若序列大小与图的节点个数不相等,则有环,否则无环。
AC代码
二、家谱树
题目描述
给定n个点与m条边,输出字典序最小的拓扑序列。
思路
模板题没什么好说的。
AC代码
三、食物链2
题目描述
给定n个点与m条边,求路径的条数。
思路
这个题可以用动态规划的思路来做。
从入度为0的点开始往后找,每次将当前节点后面的节点全部加上当前节点的值,表示终点为当前节点的路径条数。最后将所有出度为0的点的值求和并输出。
AC代码
有向无环图
有向无环图指的是一个无回路的有向图。如果有一个非有向无环图,且A点出发向B经C可回到A,形成一个环。将从C到A的边方向改为从A到C,则变成有向无环图。有向无环图的生成树个数等于入度非零的节点的入度积。