首页 > 代码库 > 拓扑排序

拓扑排序

关于拓扑排序:

以下拓扑排序的内容,只适合于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.

拓扑排序