面试百度的时候被问到了:有向无环图的拓扑排序,之前没有准备过这类的题目,刚被问到的时候有点懵,好在在面试官的引导下理清了算法思路。现记录下来,方便之后回忆。
设一个有向无环图G,其中每个节点v的入度和出度定义如下:
入度:所有指向节点v的有向边的数目。
出度:所有由节点v发出的边的数目。
对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序的序列,简称拓扑序列。
因此要得到有向无环图的拓扑排序,算法原理是:
首先统计图中每个节点的入度
选择当前图中入度为0的点加入队列
while 队列非空:
从队列中弹出一个入度为0的节点
将该节点加入输出list
更新节点相邻点的入度,邻接点入度-1,并将更新后入度为0的邻接点加入队列
until 队列为空
(如果输出list长度不等于图的节点数,则意味着图G中有环)
面试官提供的图的数据结构为:
G = [[1,2],[1,3],[2,4],[2