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

如何用NetworkX实现图为不相交路径并集的条件判断?

判断NetworkX图是否为不相交路径的并集

核心判断逻辑

一个图是不相交路径的并集,必须满足两个关键条件:

  • 所有节点的度数只能是 0、1 或 2(孤立节点度数为0,路径端点度数为1,路径中间节点度数为2)
  • 图中不存在环(环的所有节点度数都是2,但环不属于路径范畴)

原代码的问题

你的现有实现存在几个致命问题:

  • 遍历节点时直接删除边,破坏了原图结构,导致后续路径判断完全失效
  • 节点收集和路径拼接逻辑混乱,仅尝试判断两条路径,无法覆盖多个不相交路径的场景
  • 未处理孤立节点的情况,也没有排查环的存在

正确实现代码

import networkx as nx

def is_disjoint_paths_union(G):
    # 第一步:检查所有节点的度数是否合法
    for node in G.nodes():
        degree = G.degree(node)
        if degree not in {0, 1, 2}:
            return False
    
    # 第二步:遍历每个连通分量,逐一校验是否为路径或孤立节点
    for component in nx.connected_components(G):
        subgraph = G.subgraph(component)
        # 孤立节点直接通过校验
        if len(subgraph) == 1:
            continue
        # 路径必须有且仅有2个度数为1的端点
        degree_list = [subgraph.degree(node) for node in subgraph.nodes()]
        if degree_list.count(1) != 2:
            return False
        # 路径不能是环,所以要检查连通分量是否无环
        if nx.is_cyclic(subgraph):
            return False
    return True

代码说明

  1. 度数前置检查:直接过滤掉度数不符合0/1/2的节点,快速排除不符合条件的图
  2. 连通分量校验:对每个连通分量单独判断:
    • 孤立节点无需额外检查
    • 非孤立分量必须严格符合路径的端点特征(2个度数为1的节点)
    • 通过无环校验,避免把环误判为路径

测试示例

# 测试1:两个不相交路径组成的图
G1 = nx.Graph()
G1.add_path([1,2,3])
G1.add_path([4,5])
print(is_disjoint_paths_union(G1))  # 输出True

# 测试2:包含环的图
G2 = nx.Graph()
G2.add_cycle([1,2,3])
print(is_disjoint_paths_union(G2))  # 输出False

# 测试3:包含孤立节点和路径的图
G3 = nx.Graph()
G3.add_path([1,2])
G3.add_node(3)
print(is_disjoint_paths_union(G3))  # 输出True

# 测试4:存在度数为3节点的图
G4 = nx.Graph()
G4.add_edges_from([(1,2), (1,3), (1,4)])
print(is_disjoint_paths_union(G4))  # 输出False

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 18:42:17