关于新学到的拓扑排序的思考

  相关的概念: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最大食物链计数。

上一篇:【编译原理笔记16】代码优化:流图,常用代码优化方法, 基本块的优化


下一篇:【Hive】从执行计划DAG中判断找到执行慢的Task