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

如何从多重图M提取含多边节点的子图S?是否有已知算法?

提取多重图中度数≥2节点的子图:方法与思路

嘿,这个需求其实非常直观,而且属于图论里很基础的操作,完全有成熟的处理方式,咱们来拆解一下:

核心定义先明确

你要的子图S,本质上是原图M的诱导子图(Induced Subgraph)——也就是只保留原图中满足「度数≥2」的节点,同时保留这些节点之间在原图中存在的所有边(包括多重图里的重边、自环)。

具体实现步骤(通用算法逻辑)

不管你是手动实现还是用图论库,核心都是这三步:

  • 第一步:统计节点度数
    你已经用字典存储了「节点-关联边数」的映射,这一步其实已经完成了!如果是从原始多重图计算,只需要遍历所有边,给每条边的两个端点的度数各加1(多重图里每条边都要计数,哪怕是自环)。

  • 第二步:筛选符合条件的节点
    从你的度数字典里过滤出值≥2的键,这些就是子图S的节点集合。比如用Python的话可以写:

    selected_nodes = [node for node, edge_count in degree_dict.items() if edge_count >= 2]
    
  • 第三步:构建子图的边集合
    遍历原图M的所有边,只要这条边的两个端点都在筛选出的节点集合里,就把这条边保留到S中。这样得到的子图就只包含你要的节点,以及它们之间的所有原图边。

用例子直观理解

假设你的原图M:

  • 度数字典:{'A':1, 'B':3, 'C':2, 'D':4}
  • 边列表(含重边、自环):[('A','B'), ('B','C'), ('B','C'), ('C','D'), ('D','B'), ('D','D')]

按照步骤处理后:

  1. 筛选出的节点:['B', 'C', 'D']
  2. 保留的边:[('B','C'), ('B','C'), ('C','D'), ('D','B'), ('D','D')]
    这就是最终的子图S。

用图论工具快速实现

如果用Python的networkx这类图库,还能更省心:

import networkx as nx

# 假设G是你的多重图(用MultiGraph创建)
G = nx.MultiGraph()
# 先构建你的图...

# 计算度数
degrees = dict(G.degree())
# 筛选节点
selected_nodes = [n for n, d in degrees.items() if d >= 2]
# 生成诱导子图
S = G.subgraph(selected_nodes)

这个方法底层还是遵循前面的三步逻辑,只是库帮你封装了细节。

复杂度说明

整个过程的时间复杂度是O(V + E),其中V是原图节点数,E是原图边数——属于线性时间复杂度,处理大规模图也很高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:43:55