Warshall算法求解传递背包问题(Java实现)

本文介绍了传递背包的概念,强调原本邻接矩阵只能表示一步可达的连接,而传递闭包则包括多步可达的情况。通过解释Warshall算法的工作原理,展示了如何用动态规划的方式构建有向图的传递闭包。文章提供了Java代码实现,并指出算法的时间复杂度为O(n^3)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传递背包通俗理解

原本邻接矩阵就是各个顶点能通过一步就到的才能为1,
比如图中a->b,所以[a,b] = 1, d->c,所以[d,c],而a不能一步到d(虽然a最后可以通过b到达d),所以[a,d]=0
而传递闭包就是包括了这种通过多步到达的情况。

求解传递闭包

为了解决这个问题,可以通过DFS或者BFS,通过对每个顶点来进行遍历能到达的点,说明可达,以此来生成传递闭包,
但是这样做要对这幅图进行多次遍历,效率太低。

因此可以考虑使用Warshall算法通过动态规划的形式,以多阶段决策的方式来逐步构建一个有向图的传递闭包:

这里来定义一下Rk
R0 表示 从i到j不能通过中间顶点到达,即R0为原本的邻接矩阵
R1 表示 从i到j可以通过中间顶点到达,并且可达顶点的编号不大于1
....
Rk 表示 从i到j可以通过中间顶点到达,并且可达顶点的编号不大于k

通俗理解:
其实就是通过加入一个一个的中间节点看一看能不能帮助那些原本不可达的顶点转为可达。
如下面第一幅图,为原本的矩阵,
(我们这里就把a,b,c,d依次对应编号1,2,3,4)
注意到[a,b]=1,[d,a]=1,很明显可以发现d通过a可以达到b,
这种情况对应了R1:
就是说任意i到j可以通过a(编号不大于1,此处a的编号为1,符合)的顶点可达(对应d到b可以通过a)就视为可达
下面依次类推
   
根据这一系列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值