在图中寻找最短的 4 边循环
Finding shortest 4-edge cycle in graph
我想在加权有向图中找到恰好由 4 条边组成的最短循环(最短 = 边的权重的最小总和)。
我知道我可以使用 Floyd–Warshall 算法在图中找到最短循环 here。但是我不知道如何找到正好由四个边组成的最短循环。
既然你提到了 Floyd-Warshall,我认为有一个邻接矩阵不是问题。
让我们这样看:长度为 4 的循环具有 a->b->c->d->a
的形式。
将其分成两对两条边:a->b->c
和 c->d->a
.
给定邻接矩阵,我们可以很容易地使用恰好两条边计算最短路径矩阵:从 x
到 z
的最短路径是每个 x->y->z
的最小值顶点 y
。
如果我们需要呈现循环,而不仅仅是它的长度,那么给出最小值的顶点 y
也可以存储。
现在,要找到长度为 4 的最短循环,只需遍历所有可能的对 (a, c)
。
对于每个这样的对,我们有从 a
到 c
恰好两条边行进的最小成本和从 c
到 a
恰好两条边行进的最小成本.
这两个成本之和最小的对给了我们想要的周期。
解决方案的运行时间为 O(n^3),附加内存为 O(n^2)。
我想在加权有向图中找到恰好由 4 条边组成的最短循环(最短 = 边的权重的最小总和)。
我知道我可以使用 Floyd–Warshall 算法在图中找到最短循环 here。但是我不知道如何找到正好由四个边组成的最短循环。
既然你提到了 Floyd-Warshall,我认为有一个邻接矩阵不是问题。
让我们这样看:长度为 4 的循环具有 a->b->c->d->a
的形式。
将其分成两对两条边:a->b->c
和 c->d->a
.
给定邻接矩阵,我们可以很容易地使用恰好两条边计算最短路径矩阵:从 x
到 z
的最短路径是每个 x->y->z
的最小值顶点 y
。
如果我们需要呈现循环,而不仅仅是它的长度,那么给出最小值的顶点 y
也可以存储。
现在,要找到长度为 4 的最短循环,只需遍历所有可能的对 (a, c)
。
对于每个这样的对,我们有从 a
到 c
恰好两条边行进的最小成本和从 c
到 a
恰好两条边行进的最小成本.
这两个成本之和最小的对给了我们想要的周期。
解决方案的运行时间为 O(n^3),附加内存为 O(n^2)。