有向循环图或锦标赛中的侧面消除(图)

时间:2012-06-03 17:46:05

标签: algorithm graph edge directed-graph tournament

我想要一种算法来消除循环有向图的边或主要是锦标赛,并输出具有最少边数的树类结构。

消除应该基于边的重量,如下面作为一个简单的现实世界的例子所描述的。

如果有三个朋友A,B,C。采取借贷的方案&彼此之间还钱。

A人必须转移B人 - 10美元。 B人必须转移C - 20美元。 C人必须转移A人--20美元。

在最终解决方案中,为了尽量减少彼此之间的转账次数,我们可以将上述内容重新安排为“人员B将转移A人 - 10美元”之类的内容,并且一切都已解决。

我正在寻找一些算法,当给出每一侧和方向的权重时,它将适用于任意数量的节点。

鉴于图表可以重新排列并且机会很高,图表可能是“Tournament”,其中每个节点都连接到图中的所有节点,我遵循的最佳方法是什么。 / p>

先谢谢 Sudhaker

1 个答案:

答案 0 :(得分:1)

n - 1边很容易获得。首先计算每个人的“净值”,将借款人放在一个清单中,将贷款人放在另一个清单中,然后重复从借款人前面的贷款人转移到贷方,如果他们已经饱和则将其中一个或两个转移(返回零)。

前面的算法是2近似。最大限度地减少转移数量意味着最大化双饱和转移的数量,这是一个类似背包的问题,​​至少是NP难以实现的。有一个指数时动态程序可能适合小n(天真更像是n ^ n)。