You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用NetworkX提取图中的完全连通分量?

提取图中的完全连通子图(团)

你之前使用nx.connected_components得到的是连通分量——只要节点之间存在路径相连就会被归为一组,不管组内是否每个节点都两两相连,所以结果包含d是正常的,但这不符合你要找「每个节点均与其他所有节点相连」的子图的需求。

你需要的是图论中的团(Clique):团是指子图中任意两个不同节点之间都有边相连的子图。针对你的需求,可通过以下方式实现:

方法1:获取所有满足条件的极大团

如果希望得到所有满足条件且无法扩展为更大团的子图(即极大团),可以使用nx.find_cliques函数:

import networkx as nx

edges = [
    ('a', 'b'),
    ('a', 'c'),
    ('b', 'c'),
    ('a', 'd'),
    ('f', 'g')
]

graph = nx.Graph(edges)
# 获取所有极大团
max_cliques = list(nx.find_cliques(graph))
# 转换为集合列表,过滤掉单个节点的团
result = [set(clique) for clique in max_cliques if len(clique) >= 2]
print(result)

运行结果:[{'a', 'b', 'c'}, {'a', 'd'}, {'f', 'g'}]
这里{'a','d'}也是满足条件的完全子图(两个节点互相连接),如果不需要这类小团,可以额外添加过滤条件。

方法2:匹配你的期望结果(连通分量内的最大完全子图)

如果你的目标是对每个连通分量,保留其中最大的完全子图(忽略连通分量内的小完全子图),可以这样实现:

import networkx as nx

edges = [
    ('a', 'b'),
    ('a', 'c'),
    ('b', 'c'),
    ('a', 'd'),
    ('f', 'g')
]

graph = nx.Graph(edges)
result = []

for component in nx.connected_components(graph):
    subgraph = graph.subgraph(component)
    # 检查当前连通分量是否本身就是完全图
    if nx.is_complete(subgraph):
        result.append(component)
    else:
        # 找出该连通分量中的最大团
        max_clique = max(nx.find_cliques(subgraph), key=len)
        result.append(set(max_clique))

print(result)

运行结果:[{'a', 'b', 'c'}, {'f', 'g'}]
这个结果完全符合你的期望:对非完全的连通分量{a,b,c,d}提取出其中最大的完全子图{a,b,c},对本身就是完全图的连通分量{f,g}直接保留。

内容的提问来源于stack exchange,提问作者Marley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 10:57:16