图上的拼图

时间:2012-10-14 03:05:21

标签: algorithm math graph matrix network-flow

给定无向图G =(V,E),每个节点i与'Ci'个对象相关联。在每个步骤中,对于每个节点i,Ci对象在i的邻居之间平均分配。在K步之后,输出具有最多对象的前五个节点的对象数。

以下是一步中发生的事情的一个示例: enter image description here
A的对象由B和C平均分。
B的对象由A和C平分。
C的对象由A和B平均分配。

一些约束: | V |&lt; 10 ^ 5,| E |&lt; 2 * 10 ^ 5,K <10 ^ 7,Ci <1000

我目前的想法是:用矩阵表示每一步的转换。 将此问题转换为矩阵幂的计算。但考虑到| V |,这个解决方案太慢了可以是10 ^ 5.

  

有没有更快的方法呢?

1 个答案:

答案 0 :(得分:1)

单步的矩阵方程式与M x = x'类似,其中x是当前节点内容的向量,x'是一步后的内容。也就是x' = M x。之后的步骤中的内容为x" = M x' = M(M x)。下面是M的一个例子,其中图的邻接矩阵显示在左边。标题为#nbr的列是节点a,b ... e的邻居数。矩阵M由邻接矩阵形成,通过将每个1替换为等于同一列中的1的分数。

  a b c d e  #nbr          matrix M
a 0 0 1 1 0   2       0   0  1/3 1/4  0
b 0 0 0 1 0   1       0   0   0  1/4  0
c 1 0 0 1 1   3      1/2  0   0  1/4 1/2
d 1 1 1 0 1   4      1/2  1  1/3  0  1/2
e 0 0 1 1 0   2       0   0  1/3 1/4  0

要从初始内容x开始执行K步骤,只需计算(M^K) x。使用exponentiation method需要lg K矩阵乘法,lg表示对数为2的对数。由于矩阵乘法通常为O(n ^ 3)复杂度,因此此方法为O(lg K * n ^ 3)如果直接实现,或者如果使用Coppersmith / Winograd算法则为O(lg K * n ^ 2.376)。复杂度可以降低到O(n ^ 2.376) - 也就是说,我们可以将lg K乘数 - diagonalizing M降低到形式(P ^ -1)AP,{{1} }和M^K = (P^-1)(A^K)P是一个O(n lg K)操作,整体给出O(n ^ 2.376)。对角化通常花费O(n ^ 3),但是O(n ^ 2.376)using Coppersmith/Winograd algorithm