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

NetworkX图中查找移除后不新增bridge的可删除edge的高效方法

更优实现方案说明

你当前使用的逐边移除+校验桥的方案时间复杂度很高,假设图有n个顶点m条边,单次求桥的Tarjan算法时间复杂度为O(n+m),遍历所有边的总复杂度为O(m*(n+m)),边数过万的话运行耗时会非常明显,可通过边连通分量的性质直接筛选符合要求的边,不需要逐边校验。

核心判定逻辑

你要的「移除后不产生新桥的边」,本质是图中属于3-边连通分量的边:

  • 本身就是桥的边直接排除:这类边属于1-边连通分量,移除后直接拆分原图,必然不符合要求
  • 仅属于2-边连通分量但不属于3-边连通分量的边(比如三角形里的任意边):移除后原来的2-边连通分量会被拆成路径结构,产生大量新桥,不符合要求
  • 属于3-边连通分量的边:这类边所在的极大子图需要至少删除3条边才会丧失连通性,仅移除1条的话子图仍保持2-边连通,不会产生任何新桥,完全符合要求

该方案的总时间复杂度仅为O(n+m),对比原有方案有数量级的效率提升。

NetworkX实现代码

import networkx as nx

def get_removable_edges(G: nx.Graph):
    # 第一步:筛选排除原图所有桥
    bridges = set(nx.bridges(G))
    # 第二步:获取所有3-边连通分量的顶点集合
    three_eccs = list(nx.edge_kcomponents(G, k=3))
    # 给每个顶点标记所属的3-边连通分量ID
    node_to_eccid = {}
    for ecc_id, nodes in enumerate(three_eccs):
        for node in nodes:
            node_to_eccid[node] = ecc_id
    # 第三步:筛选符合要求的边
    removable_edges = []
    for u, v in G.edges():
        if (u, v) in bridges or (v, u) in bridges:
            continue
        if node_to_eccid[u] == node_to_eccid[v]:
            removable_edges.append((u, v))
    return removable_edges

多轮移除优化提示

如果需要移除多条符合要求的边,不需要每次重新跑全量流程:

  • 只要每次移除的边都属于同一个3-边连通分量,移除后仅需重新计算该分量的3-边连通性即可,不需要处理整张图
  • 如果需要每次移除后更新全量候选列表,也可以基于上次的3-边连通分量结果做增量计算,不用全量重跑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:15:01