问题描述
给定一个强连通的有向加权图。我需要从这个图中找到一个强连通子图,使得最大和最小权重边之间的差异是最低。
更清楚地说,我需要去除边,这样在去除它们后,图将仍然是强连通的,而 最大和最小权重边之间的差异是最小。
这是一个例子:
第一行是这个图的N个节点和M条边的数量。接下来的 M 行代表这个图的边。
3 6
1 2 8
2 3 32
3 1 16
1 3 81
3 2 243
2 1 27
所选的 N 节点子图将包含边:
1 2 8
2 3 32
3 1 16
最大权重边和最小权重边之差为:32 - 8 = 24。 在所有选项中哪个是最小的。
我正在寻找最佳解决方案。最多有 3000 个节点和 5000 个边。
解决方法
给定一个算法来测试给定的有向图 G = (V,E) 是否在 O(f(|V|,|E|)) 时间内强连通,这个问题可以在 O(|E|) 时间内解决*f(|V|,|E|)) -- 如果在已测试的有向图中添加或删除单个边后可以更快地完成强连通性测试,效果会更好。
按权重递增排序边,并按此顺序编号。最初,将第一条(权重最低的)边添加到所选边的集合 E' 中;只要 E' 不是强连接,就向它添加下一条边。如果此循环不终止,则 G 不是强连接的。否则,当它停止时,在添加边 j 之后,我们已经找到了一个最小差分解,因为我们包含了边 1。将此 (1,j) 解决方案记录为现任方案。
现在从 E' 中移除边 1,所以边 2 是 E' 中剩余的最低权重边。保留所有其他已经确定的边,并再次开始添加下一个权重最低的边,从边 j+1 开始,直到形成 SCG。对于每个 i ,可以重复此操作以计算最小差异解。保持最好的整体。
注意,在求解起点 i+1 时,不需要去掉为前一个起点 i 确定的边:如果边 i,i+1,...,j-1 做不形成 SCG,则边 i+1,i+2,j-1 也不形成 SCG。利用这一点意味着整个外循环只运行 |E|次,而不是 O(|E|^2) 次。