相关的概念:1.有向图无环图(Directed acyclic graph 简称DAG):对于一个有向图,任选一个顶点,该顶点经过若干条边都无法到达原来顶点,则该图为DAG,反之则不为DAG。
2.拓扑序列:设G=(V,E)是一个具有n个顶点的有向图,集合V的顶点序列v1,v2,v3.....vn称为一个拓扑序列,则满足下列条件:若从顶点vi到vj有一天路径,则该拓扑序列中vi必须要在vj之前。
3.拓扑排序:对一个有向图构造拓扑序列的过程。
4.只有有向无环图才有拓扑排序。
拓扑排序的思路:1.先将所有的边存入邻接链表(数组)中,统计各个点的入度数量。
2.遍历所有顶点,若顶点的入度数量为0,则入队列中。
3.将队首元素出列,在更新队首元素相连接的顶点,若入度的为0,则入队列中,循环此操作,直到队列为空。
(可略)4.若出列的元素的数量等于输入顶点的数量,则为DAG,反之则不为DAG。
伪代码展示:
cin>>n>>m;输入顶点数,和边的数量。 for(int i=1;i<=m;i++){ 输入对应的边,存入到邻接链表中。 记录入度的数量(有些题目还要记录出度的数量,如洛谷p4017最大食物链计数) } for(int i=1;i<=n;i++){ if(该点的入度为0) 入队列中 } while(队列不为空){ 出队首元素 更新队首元素的相连接的顶点的入度数量 ............. if(相连接的顶点的入度为0) 将该顶点入队列尾部 } 输出结果
拓扑排序的应用题目类型:1.求给定的任务的序列(裸拓扑)
2.求最长路(加dp)
3.求最短路(加dp)——未探索
4.判断是否有欧拉回路(裸拓扑)
实际应用题目总结:
1.由于拓扑排序的这种遍历顶点的方式具有无后效性,使得拓扑排序常常和动态规划想结合(动态规划的原则就是无后效性)。
2.当题目暗示或者明显示这个图是一个有向无环图时,就该想到拓扑排序+dp了。
3.经典例题: 1.拓扑排序模板题:(uva10305)洛谷pUVA10305——给任务排序。
2.与dp相互结合的例题:洛谷p1807求——最长路,洛谷p1137——旅行计划,洛谷p4017最大食物链计数。