往期文章目录
【干货满满!】图解Dijkstra迪杰斯特拉
【上篇文章!】手撕Floyd弗洛伊德
目录
前言
无论是什么程序都要和数据打交道,一个好的程序员会选择更优的数据结构来更好的解决问题,因此数据结构的重要性不言而喻。数据结构的学习本质上是让我们能见到很多前辈在解决一些要求时间和空间的难点问题上设计出的一系列解决方法,我们可以在今后借鉴这些方法,也可以根据这些方法在遇到具体的新问题时提出自己的解决方法。(所以各种定义等字眼就不用过度深究啦,每个人的表达方式不一样而已),在此以下的所有代码都是仅供参考,并不是唯一的答案,只要逻辑上能行的通,写出来的代码能达到相同的结果,并且在复杂度上差不多,就行了。
一、Topo排序不是排序
首先我们要知道:topo排序并不是真的排序!topo排序是针对于有向无环图而言,搞出一个带有路径(前后)关系的一个序列,而这个序列就叫做topo序列;
二、AOV网和Topo序列
1.AOV网的概念
在一个表示工程的有向图中顶点表示活动,而边表示活动之间的优先级关系,这种图就叫AOV网 (记住这个V表示顶点嘛),所以AOV网是针对于顶点的,而不是针对于边(在图中只有两种关系:针对于顶点和针对于边);
2.Topo序列的概念和思想
- 具有n个顶点的有向图,只要满足 Vi 到 Vj 有路径并且 Vi 要在 Vj 之前,对于这种顶点序列就叫做topo序列;
- topo排序算法思想:在有向图中选一个没有前驱的节点,输出(放入序列中),从图中删除顶点和以它为尾的弧;
这是什么意思呢,我们以如下有向无环图为例:
假设我们以出度为弧尾,那么根据上述topo排序的思想,我们要先找一个没有前驱的节点(也就是没有入度的节点),那么我们可以很容易的得到 V1 和 V5 都是没有前驱的节点,那我们先输出V1,并在图中删去 V1 以及以 V1 为尾的弧,如下图所示;
接着我们输出V5,在图中删去 V5 以及以 V5 为尾的弧,如下图所示;
这个时候我们发现 V3 和 V4 也成了一个没有前驱的节点,那么我们就应该重复上述的步骤,输出V3 和 V4 并在图中删去与它们有关的顶点和弧;
输出V3:
输出V4:
这时候 V2 和 V6 也成了没有前驱的节点并且在图中也没有它们的出度的弧,那么只要输出它们即可;
- 所以经过如上的步骤,我们可以得到一个topo序列:{ V1 V5 V3 V4 V2 V6 };那么这就是topo排序的思想和实现topo序列的步骤;
- 那么这时候可能有人就要问了: