Python 在NetworkX中完全连接未连接的图形

Python 在NetworkX中完全连接未连接的图形,python,networkx,graph-theory,Python,Networkx,Graph Theory,我有一个非完全连通的图,我需要通过在图的组件之间随机分配边将其转换为完全连通的图。在networkx中有没有一种聪明的方法可以做到这一点 例如,如果我有以下图表: >>> import networkx as nx >>> G = nx.fast_gnp_random_graph(10000,0.0001,seed=1) >>> print("Connected?",nx.is_connected(G)) Connect

我有一个非完全连通的图,我需要通过在图的组件之间随机分配边将其转换为完全连通的图。在
networkx
中有没有一种聪明的方法可以做到这一点

例如,如果我有以下图表:

>>> import networkx as nx

>>> G = nx.fast_gnp_random_graph(10000,0.0001,seed=1)
>>> print("Connected?",nx.is_connected(G))
Connected? False
它有5031个组件。

如何随机分配使此图形完全连接所需的最小边数?

如果您有5031个组件,则必须精确分配5030条边才能连接图形

这很简单,你可以贪婪地做这件事。
首先,计算组件集
C
(可以将组件表示为一组顶点)。
然后执行以下操作(伪代码):

C=连接的_组件_(图)#顶点集
而len(C)<2:
c1=C.pop()
c2=C.pop()
v1=在(c1)中选择任意顶点
v2=在(c2)中选择任意顶点
添加_边(v1、v2)
C.添加(c1 | c2)
图将是connex。

按照中的思想,我们可以迭代连接组件的集合,并连接随机的节点对。使用
组合的优点是,我们只需要在组件上迭代一次,并且我们确保在每次迭代中,以前看到的组件都被忽略,因为在
组合中
顺序无关紧要,即,如果我们看到了组合
(1,2)
,我们就不会被seing
(2,1)
,这可能导致两个组件通过两个不同的节点连接,并且可能与图的其余部分隔离

因此,使用示例的简化版本:

G = nx.fast_gnp_random_graph(100,0.02,seed=1)

plt.figure(figsize=(12,6))
nx.draw(G, node_size=100, node_color='lightgreen')


答案有用吗?别忘了你可以投票并接受答案。看,谢谢!
G = nx.fast_gnp_random_graph(100,0.02,seed=1)

plt.figure(figsize=(12,6))
nx.draw(G, node_size=100, node_color='lightgreen')
import random
from itertools import combinations, groupby

components = dict(enumerate(nx.connected_components(G)))
components_combs = combinations(components.keys(), r=2)

for _, node_edges in groupby(components_combs, key=lambda x: x[0]):
    node_edges = list(node_edges)
    random_comps = random.choice(node_edges)
    source = random.choice(list(components[random_comps[0]]))
    target = random.choice(list(components[random_comps[1]]))
    G.add_edge(source, target)

plt.figure(figsize=(12,6))
nx.draw(G, node_size=100, node_color='lightgreen')