TopologicalSort

0.拓扑序:在计算机科学领域,有向图的拓扑排序是对其顶点的一种线性结构,是的对于从顶点u到顶点v的每个有向边uv,u都排在v之前。

PS:当且仅当图中没有定向环时,即有向无环图,才有可能行进行拓扑排序。

1.在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,才能称为改该图的一个拓扑排序:

<1>:序列中包含每个顶点,且每个顶点只出现一次。

<2>:若A在序列中排在B的前面,则在图中不存在从B到A的路径。

2.卡恩算法:卡恩于1962年提出了该算法。

简单来说就是:

1.假设L是存放结果的列表,先找到那些入度为0的节点,把这些节点加入到L中,因为这些节点没有任何的父节点(即入度为0)。

2.然后把这些节点相连的边从图中去掉,再寻找图中的入度为0的节点。

3.对于那些新找到的入度为0的节点来说,他们的父节点已经在L中了,所以也可以放入L

4.重复上述操作,知道找不到入度为0的节点。

5.如果此时L中的元素个数和节点总数相等,说明排序完成了;如果L中的元素个数和节点总数不同,说明图中有环,无法进行拓扑排序。

3.深度优先搜索

1.假设L是一个空的存放结果的列表。深度优先搜索任意顺序循环遍历图中的每个节点。如果此节点入度为0,将其加入到L,并标记已访问过。

2.如果遇到了之前已经遇到的节点或者叶节点,直接终止算法。

2.重复所有的节点。如果L的元素等于节点元素个数,说明拓扑排序已完成,否则说明原图中存在环,无法进行拓扑排序。

你可能感兴趣的:(TopologicalSort)