拓扑排序
设有一个有向无环图(DAG 图),对其进行拓扑排序即求其中结点的一个拓扑序列,对于所有的有向边(U,V)(由 U 指向 V),在该序列中结点 U 都排列在结点 V 之前。满足该要求的结点序列,被称为满足拓扑次序的序列。求这个序列的过程,被称为拓扑排序。
由满足拓扑次序序列的特征也能得出其如下特点:
若结点U经过若干条有向边后能够到达结点V,则在求得的序列中U必排在V之前。
将拓扑排序限定在一个有向无环图上,是因为若图无向,则边的两个顶点等价,不存在先后关系;若图为有向图,但存在一个环路,则该环中所有结点无法判定先后关系(任意结点间
都能通过若干条有向边到达)。
如何求一个有向无环图的拓扑序列,即拓扑排序的方法:
首先,所有有入度(即以该结点为弧头的弧的个数)的结点均不可能排在第一个。那么,我们选择一个入度为 0 的结点,作为序列的第一个结点。当该结点被选为序列的第一个顶点后,我们将该点从图中删去,同时删去以该结点为弧尾的所有边,得到一个新图。那么这个新图的拓扑序列即为原图的拓扑序列中除去第一个结点后剩余的序列。
同样的,我们在新图上选择一个入度为 0 的结点,将其作为原图的第二个结点,并在新图中删去该点以及以该点为弧尾的边。这样我们又得到了一张新图,重复同样的方法,直到所有的结点和边都从原图中删去。若在所有结点尚未被删去时即出现了找不到入度为 0 的结点的情况,则说明剩余的结点形成一个环路,拓扑排序失败,原图不存在拓扑序列。