如何用Python的NetworkX编写判断图是否为长度≥4的导出环的函数
实现判断图是否为Hole(长度≥4的导出环)的函数
首先明确Hole的定义:Hole是指长度至少为4的导出环,即整个图是一个无弦的简单环,环上任意两个非相邻节点在图中没有额外边,且环的节点数≥4。
现有代码的问题
你当前的函数逻辑完全偏离了Hole的核心特征:仅简单检查节点列表首尾的路径和邻接关系,既没有验证环的结构,也没有保证是导出环,无法正确判断目标情况。
正确实现思路
要判断一个图是否是Hole,需要满足以下所有条件:
- 图的节点数≥4;
- 图是连通的;
- 每个节点的度数都是2(环上每个节点仅与两个邻居相连,若存在弦则节点度数会大于2);
- 图的边数等于节点数(简单环的边数与节点数相等)。
基于这些条件,结合NetworkX实现函数:
import networkx as nx def is_hole(g): n_nodes = nx.number_of_nodes(g) # 条件1:节点数至少为4 if n_nodes < 4: return False # 条件2:图连通 if not nx.is_connected(g): return False # 条件3:所有节点度数都是2 if not all(degree == 2 for _, degree in g.degree()): return False # 条件4:边数等于节点数(简单环的边数与节点数一致) if nx.number_of_edges(g) != n_nodes: return False # 所有条件满足,即为Hole return True # 测试你的示例图 connec2=[('1', '3'), ('1', '4'),('1','6'), ('2', '3'),('2', '7'),('3','8'),('3','6'),('3', '4'), ('4', '5') ,('4','9'),('4','6'),('5','10'),('7','8'),('8','11'),('11','9'),('9','10')] g = nx.Graph() g.add_edges_from(connec2) print(is_hole(g)) # 输出False,因为图中存在度数大于2的节点(比如节点1度数为3) # 测试标准Hole(四边形) hole_graph = nx.cycle_graph(4) print(is_hole(hole_graph)) # 输出True # 测试五边形Hole hole_graph_5 = nx.cycle_graph(5) print(is_hole(hole_graph_5)) # 输出True # 测试带弦的环(不是导出环) non_hole = nx.cycle_graph(4) non_hole.add_edge(0, 2) # 添加对角线弦 print(is_hole(non_hole)) # 输出False,因为节点0和2的度数变为3
逻辑说明
- 节点数≥4:直接排除短环(如三角形);
- 连通性:确保整个图是单一的环,而非多个不连通的子图;
- 度数全为2:保证每个节点仅连接环上的两个邻居,不存在额外的弦(否则度数会超过2);
- 边数等于节点数:验证图的结构是严格的环,进一步提升判断的严谨性(前三个条件满足时该条件通常自动成立,但额外校验更稳妥)。
内容的提问来源于stack exchange,提问作者myself
相关产品推荐
相关产品推荐

