给出有向图G允许平行边,那么在G中找到最大平行边数的有效算法是什么?
答案 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。
然后,您的平行边仅是入射矩阵中的相同列。您可以像对任何旧数组中的重复元素进行计数一样对它们进行计数,例如通过对数组进行排序。另一种方法是将入射矩阵转换为邻接矩阵,并对每个单元格出现的重复项进行计数。顺便说一句,此过程看起来很像存储桶排序或基数排序的关联矩阵列。