本来这个问题应该是放在并查集里面一起说明,不过并查集篇幅比较大,就单独把这个问题拿出来了。
并查集的问题也可以转化为图的连通子图问题。给一个图G,返回它的所有不连通的子图。
1. 使用networkx包求图的所有不连通的子图
主要使用connected_components()方法。下面是一个例子。
import networkx as nx
import matplotlib.pyplot as plt
pointList = ['A','B','C','D','E','F','G']
linkList = [('A','B'),('B','C'),('C','D'),('E','F'),('F','G'),]
def subgraph():
G = nx.Graph()
# 转化为图结构
for node in pointList:
G.add_node(node)
for link in linkList:
G.add_edge(link[0], link[1])
# 画图
plt.subplot(211)
nx.draw_networkx(G, with_labels=True)
color =['y','g']
subplot = [223,224]
# 打印连通子图
for c in nx.connected_components(G):
# 得到不连通的子集
nodeSet = G.subgraph(c).nodes()
# 绘制子图
subgraph = G.subgraph(c)
plt.subplot(subplot[0]) # 第二整行
nx.draw_networkx(subgraph, with_labels=True,node_color=colo