我们先搞清楚一个概念:
什么是出度与入度?
在有向图中,箭头是具有方向的,从一个顶点指向另一个顶点,这样一来,每个顶点被指向的箭头个数,就是它的入度。从这个顶点指出去的箭头个数,就是它的出度
1、选择任意一个入度为0的节点(即该节点没有被任意一个箭头指向),并将该节点输出,然后在图中删除该节点和从他出发的有向边(有向边被指向的所有节点入度减1)
2、删除完后,下一个入度为0的节点是5,将5输出,并且删除节点5,并删除从节点5出发指向2和6的有向边。(有向边被指向的节点2和节点6 入度减1)
3、此处,2和6都是入度为0的节点,可以选择任意一个操作,这里我们选择2操作,重复步骤
4、从入度为0的节点3和节点6中任意选择一个重复上述步骤,这里我们选择节点3,并将3输出,删除节点3和从3出发的有向边(有向边被指向的节点3 入度减1)
5、发现只剩下一个(入度为0)的节点6,将6输出,删除节点6和从6出发的有向边(有向边被指向的节点4 入度减1),再选择4,删除,输出.
最终得到的结果是 1 5 2 3 6 4
我们刚刚如果在面临2个同时入度为0的节点时,选择的不一样,会造成拓扑排序的序列不一致,因此,拓扑排序序列并不唯一。(存在多种可能)
我们来看下面一道例题
根据邻接表画图的结构
以上这个图被称为邻接表,第一列的数组的所有数据(A,B,C,D,E)记载的是图中每一个节点的连接情况,我们用0表示A,1表示B,即(A=0 B=1 C=2 D=3 E=4),正式的邻接表不存在字母的,将数字代替字母。
每个节点由两部分组成,前面存储数据,后面存储指针(箭头的指向),若它没有下个指向的目标了,则存储 ^ 符号,表示 下个指向 为空 如果该节点同时指向多个不同的节点,则按照从节点小到大顺序,依次首尾相连,例如 上图中的A与节点1(B)和节点2(C)
拓扑排序要注意的一点是,如果图的结果构成一个环,则该图没有拓扑排序。