zoukankan      html  css  js  c++  java
  • 拓扑排序

    关于拓扑排序:

    以下拓扑排序的内容,只适合于AOV网。简单来说就是有向无环图。

    1)举一个简单明了的栗子。(网上大部分都是这个栗子)

    “选课”

    比如说。我想选修课程B,但是我必须先选修课程A。选课程A之前。还得选修课程C。这就自然形成了一个简单的图。

    C-》A-》B

    只有选完c。才能说a的事情。选完a才能提选b的事情。

    发现这里。要先完成的事情。必须要比后完成的事情提前完成(这是人之常情)。

    而拓扑排序的作用呢。就是将一个有向图。压缩成一个线性的序列。使得先要完成的在前面。后完成的总在先完成的后面。

    这里提几个专有名词。

    前驱活动:我们把一条有向边的起点活动称为终点活动的前驱活动(例如c是a的前驱活动)。

    后驱活动:同理把一条有向边的终点活动称为起点活动的后驱活动(例如a是c的后驱活动)。

    而拓扑排序出来的线性的序列,叫拓扑序列。(hhhhh这个名字很裸)

    构造拓扑序列可以帮助我们合理安排一个工程的进度。由AOV网构造拓扑序列具有很高的实际应用价值。

    2)举一个复杂的大栗子。

    “选课2”

    比如说。我想选修B。但是我必须选修课程A。选修课程A。之前还得选修课程C和课程D。选修课程D必须选修课程F。

    画出来就是这个样子:(有点丑)

     

    而这个如果像我们前面说的要压缩成一个线性的序列呢。

    可以发现。这个答案好像可以有好多种。不止一种。

    like   F  D  C  A  B    或者是  C F D A B 。

    好像这些都满足前面的条件。前驱活动一定在后驱活动前面的序列。

    这说明一个拓扑排序。不唯一。它有些是没有唯一的答案。几种都可以满足。

    3)举一个不能吃的栗子

    “选课3”

    比如说。我想选修B,但是我必须先选修A。选修A之前我必须选修C。选修C之前。我必须先选修B。

    C-》A-》B-》C

    靠。这怎么选。选每个都有一个条件。然而这个条件是环形。简直无入口与出口。。

    而这个图。就是一个典型的有向环形图。

    里面有个环。然而这种情况无法写成线性的拓扑序列。(有本事你写个出来)

    所以,前面有讲,拓扑排序必须在有向无环图里面才可以得以实现。

    这是个大前提。(重点)。

    4)如何实现拓扑排序呢?

    有以下几种步骤:

    1,选择一个入度为0的点。记录这个点。(如果一个图里,没有一个点的入度为0,则这个图现在是有向环形图)

    2,在图中把由这个点为起点的所有边,抹杀掉。(这个点的后驱活动的点的入度--)

    3,一直重复前面的动作。把一个一个点抹杀掉。

    4,然而当没有入度为0的点。但是图里的点有 没有被抹杀掉的。说明。嗯。这个图里有个环。

    这样就完成了我们的拓扑排序。

    简单&高效&实用der算法。

     the end.

  • 相关阅读:
    linux安装mongodb磁盘空间不足
    ccf颁奖晚会
    Bug总结流程
    测试自学过程
    一个div,包含两个div,调整文字位置和div平均分布
    一个div,包含三个小的div,平均分布的样式
    测试成长之路
    k8s常用命令记录
    K8S 1.20.6安装dashboard(基于kubernetes-dashboard 2.0.0版本)
    F. Programming Contest
  • 原文地址:https://www.cnblogs.com/uncle-lu/p/5856178.html
Copyright © 2011-2022 走看看