java 有向无环图 树_拓扑排序-有向无环图(DAG, Directed Acyclic Graph)

条件:

1.每个顶点出现且只出现一次。

2.若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。

有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。

一般用有向边指示顺序关系,运用于顺序关系。

例如,下面这个图:

e54d13601a423a90f00c6f65e09e96d9.png

显然是一个DAG图,1→4表示4的入度+1,4是1的邻接点,

代码表示:前者deg[4]++;后者用vector[1].push(4)

如何写出拓扑排序代码?

1.首先将边与边的关系确定,建立好入度表和邻接表。

2.从入度为0的点开始删除,如上图显然是1的入度为0,先删除。

19332a827deb054d32997e88d38592db.png

3.于是,得到拓扑排序后的结果是 { 1, 2, 4, 3, 5 }。通常,一个有向无环图可以有一个或多个拓扑排序序列。因为同一入度级别的点可以有不同的排序方式。

4.拓扑排序可以判断图中有无环,如下图

d629e0da68d1b220603200310b338461.png

显然4,5,6入度都是1,不存在入度为0的点,无法进行删除操作。判断有无环的方法,对入度数组遍历,如果有的点入度不为0,则表明有环。

例题+代码

拓扑排序(一)-Hiho-Coder1174

描述

由于今天上课的老师讲的特别无聊,小Hi和小Ho偷偷地聊了起来。

小Ho:小Hi,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值