传递背包通俗理解
原本邻接矩阵就是各个顶点能通过一步就到的才能为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,符合)