我想要一种算法来消除循环有向图的边或主要是锦标赛,并输出具有最少边数的树类结构。
消除应该基于边的重量,如下面作为一个简单的现实世界的例子所描述的。
如果有三个朋友A,B,C。采取借贷的方案&彼此之间还钱。
A人必须转移B人 - 10美元。 B人必须转移C - 20美元。 C人必须转移A人--20美元。
在最终解决方案中,为了尽量减少彼此之间的转账次数,我们可以将上述内容重新安排为“人员B将转移A人 - 10美元”之类的内容,并且一切都已解决。
我正在寻找一些算法,当给出每一侧和方向的权重时,它将适用于任意数量的节点。
鉴于图表可以重新排列并且机会很高,图表可能是“Tournament”,其中每个节点都连接到图中的所有节点,我遵循的最佳方法是什么。 / p>
先谢谢 Sudhaker
答案 0 :(得分:1)
n - 1边很容易获得。首先计算每个人的“净值”,将借款人放在一个清单中,将贷款人放在另一个清单中,然后重复从借款人前面的贷款人转移到贷方,如果他们已经饱和则将其中一个或两个转移(返回零)。
前面的算法是2近似。最大限度地减少转移数量意味着最大化双饱和转移的数量,这是一个类似背包的问题,至少是NP难以实现的。有一个指数时动态程序可能适合小n(天真更像是n ^ n)。