拓扑排序(数据结构之图的应用)

我们先搞清楚一个概念:

什么是出度与入度?
在有向图中,箭头是具有方向的,从一个顶点指向另一个顶点,这样一来,每个顶点被指向的箭头个数,就是它的入度。从这个顶点指出去的箭头个数,就是它的出度

 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)

 拓扑排序要注意的一点是,如果图的结果构成一个环,则该图没有拓扑排序

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值