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

如何在带边容量的无向图中查找满足需求的简单路径?

查找无向图中满足边容量要求的所有简单路径

问题描述

给定带边容量属性的无向图G,输入源节点(SourceNode)、目标节点(TargetNode)和需求值(demand),需要找出所有简单路径(路径中无重复节点),要求路径上的每条边的capacity属性值都≥demand。

已知NetworkX的network_simplex()或min_cost_flow()仅能返回流形式结果,无法直接得到所需的路径列表,因此需要另一种实现方式。

解决方案思路

核心逻辑是先过滤出符合容量要求的子图,再在子图中查找所有源到目标的简单路径:

  • 第一步:从原图中筛选出所有capacity ≥ demand的边,构建一个只包含这些边的子图。这样子图中的任意路径天然满足容量约束。
  • 第二步:在这个子图中,使用NetworkX的路径查找工具获取所有源到目标的简单路径。
  • 第三步:将路径格式化为指定的字符串形式(如"a,c,d")。

代码实现

import networkx as nx

def find_valid_paths(G, source, target, demand):
    # 构建符合容量要求的子图
    valid_edges = [(u, v) for u, v, attrs in G.edges(data=True) if attrs.get('capacity', 0) >= demand]
    subgraph = nx.Graph()
    subgraph.add_edges_from(valid_edges)
    
    # 检查源和目标是否在子图中连通,不连通直接返回空列表
    if not nx.has_path(subgraph, source, target):
        return []
    
    # 获取所有简单路径并格式化
    all_paths = nx.all_simple_paths(subgraph, source=source, target=target)
    formatted_paths = [','.join(path) for path in all_paths]
    return formatted_paths

# 示例测试
if __name__ == "__main__":
    G = nx.Graph()
    G.add_edge("a", "b", capacity=4)
    G.add_edge("a", "c", capacity=10)
    G.add_edge("b", "d", capacity=9)
    G.add_edge("c", "d", capacity=5)
    
    # 调用函数,需求值为5
    result = find_valid_paths(G, "a", "d", demand=5)
    print(result)  # 输出: ['a,c,d']

说明

  • 若原图中不存在满足容量要求的连通路径(比如源和目标在筛选后的子图中不连通),函数返回空列表。
  • nx.all_simple_paths()会枚举所有不重复经过节点的路径,完全符合问题中"简单路径"的要求。
  • 代码中默认边的capacity属性存在,若部分边无该属性,会默认按0处理(即不满足任何正需求)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:20:27