在多向图中找到最大平行边数

时间:2019-01-26 22:56:50

标签: algorithm math graph max networkx

给出有向图G允许平行边,那么在G中找到最大平行边数的有效算法是什么?

2 个答案:

答案 0 :(得分:0)

一个简单的解决方案是遍历图中的所有节点对,并计算每对节点的边数。但是,许多现实生活中的图都是稀疏的-相对于图中的节点总数,每个节点只有很少的邻居。因此,更合理的解决方案是执行以下操作:

import networkx as nx

# Build a sample graph:
G = nx.MultiDiGraph()
G.add_edges_from([('a', 'b'),('b', 'c'),('c', 'd'), ('b', 'c'), ('b', 'c'), ('a', 'b')])

max = 0
arg_max = ()
for source in G.nodes():
    for target in G.neighbors(source):
        n = G.number_of_edges(source, target)
        if n > max:
            max = n
            arg_max = (source, target)

print('max # of edges = {}, for nodes: {}'.format(max, arg_max))

在这里,我们仅遍历每个节点的邻居,因此即使在最坏的情况下(当图表是一个小集团时),我们也没有改善运行时间,但在大多数情况下,我们可能会在实践中对其进行改进。

>

答案 1 :(得分:0)

首先,您需要修改关联矩阵的定义,因为您所拥有的不能代表直接(多)图。这种变化可能是微不足道的,例如如果边j进入/离开/与顶点i Wikipedia无关,则A(i,j)= 1 / -1 / 0。

然后,您的平行边仅是入射矩阵中的相同列。您可以像对任何旧数组中的重复元素进行计数一样对它们进行计数,例如通过对数组进行排序。另一种方法是将入射矩阵转换为邻接矩阵,并对每个单元格出现的重复项进行计数。顺便说一句,此过程看起来很像存储桶排序或基数排序的关联矩阵列。