0

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

消除应基于侧面的重量,如下面的简单现实示例所述。

如果有三个朋友 A,B,C。以彼此之间借钱和还钱为例。

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

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

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

鉴于该图可以重新排列,并且该图很可能是一个“锦标赛”,其中每个节点都连接到图中的所有节点,那么我遵循的最佳方法是什么。

4

1 回答 1

1

n - 1 条边很容易获得。首先计算每个人的“净资产”,将借款人放在一个列表中,将贷方放在另一个列表中,然后反复从排在最前面的借款人转移到贷方,如果饱和则删除一个或两个(返回为零)。

前面的算法是一个 2 近似。最小化传输的数量意味着最大化双饱和传输的数量,这是一个类似背包的问题,​​至少是弱 NP-hard。有一个指数时间动态程序可能适用于小 n(天真的更像 n^n)。

于 2012-06-03T18:23:39.147 回答