<p>按照<a href="https://stackoverflow.com/a/61961881/9698684">this answer</a>中的思想,我们可以迭代连接组件的<a href="https://docs.python.org/2/library/itertools.html#itertools.combinations" rel="nofollow noreferrer">^{<cd1>}</a>并连接随机的节点对。使用<code>combinations</code>的优点是,我们只需要在组件上迭代一次,并且我们确保在每次迭代中忽略以前看到的组件,因为<code>combinations</code>顺序并不重要,也就是说,如果我们看到了组合<code>(1,2)</code>,我们就不会看到<code>(2,1)</code>,这可能导致两个组件通过两个不同的节点连接,并且可能与图的其余部分隔离</p>
<p>因此,使用示例的简化版本:</p>
<pre><code>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')
</code></pre>
<p><a href="https://i.stack.imgur.com/cfatd.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/cfatd.png" alt="enter image description here"/></a></p>
<pre><code>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')
</code></pre>
<p><a href="https://i.stack.imgur.com/Ww1GY.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Ww1GY.png" alt="enter image description here"/></a></p>