拓扑排序:是对有向无环图上的节点进行线性排序,使得对于每一个顶点有向边指向另一个顶点 , 指向的顶点在被指向的顶点之前出现。简单地说,是在不破坏节点先后顺序的前提下,把有向无环图拉成一条链。
1.每个顶点出现且只出现一次。
2.若存在一条从顶点 A 到顶点 B 的路径(不存在顶点B到顶点A的路径),那么在序列中顶点 A 出现在顶点 B 的前面。
基本步骤:
1.从有向无环图中找到一个入度为零(即没有被指向的顶点)并输出。
2.删除这个入度为零的顶点及链接的有向边。
3.重复循环操作以上步骤直至将所有的顶点输出。(若不能全部输出,则说明途中存在环)
我们需要知道度的一些知识。
度:一个顶点的度是指与该顶点相关联的边的条数。
对于有向图来说,一个顶点的度可细分为入度和出度。
入度:一个顶点的入度是指与其关联的各边之中,以其为终点的边数。
出度:出度则是相对的概念,指以该顶点为起点的边数。
图示如下:
拓扑排序后的结果:AEBDC。
A的入度为0,出度为2; B的入度为2,出度为2;
C的入度为2,出度为0; D的入度为2,出度为1;
E的入度为1,出度为2。
注意事项:
1.入度为零的顶点被删除后需重新定义顶点的入度,即把这个顶点指向的顶点的入度减一,后面的顶点入度依次减一。
2.若入度为零的顶点不唯一,从中随机选择即可,这意味着拓扑排序的结果不一定是唯一的。