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

Python中基于节点值合并列表实现图邻接表结构

图结构转邻接表实现方案

问题背景

输入格式:首行是边的数量,后续每行是一条边的两个节点ID。示例输入:

3
0 1
0 2
1 2

现有解析及Networkx建图代码:

E = int(input())
lst = []
lst_ = []

for x in range(E):
    l, q = map(int, input().split())
    lst.append(l)
    lst_.append(q)
import networkx as nx
G = nx.Graph()
for x in range (len(lst)):
    G.add_edge(lst[x],lst_[x])

需要将图转为邻接表形式的嵌套列表,示例输出:

mega_lst = [[1,2],[0,2],[0,1]]

简便实现方案

方案1:字典构建邻接关系转嵌套列表

无需额外依赖,先通过字典收集每个节点的邻居,再按节点ID顺序生成列表:

E = int(input())
adj_dict = {}
all_nodes = set()

for _ in range(E):
    u, v = map(int, input().split())
    # 无向图双向添加邻居
    adj_dict.setdefault(u, []).append(v)
    adj_dict.setdefault(v, []).append(u)
    all_nodes.update({u, v})

# 按节点ID升序生成邻接表
max_node = max(all_nodes)
mega_lst = [adj_dict.get(node, []) for node in range(max_node + 1)]

print(mega_lst)

注:若节点ID不连续,可根据需求调整列表生成逻辑,比如只保留存在的节点对应的子列表。

方案2:直接用列表索引映射节点ID

适合节点ID从0开始连续的场景,先确定节点总数,初始化空邻接表后逐个添加邻居:

E = int(input())
max_node = -1
edges = []

# 先遍历一次获取最大节点ID
for _ in range(E):
    u, v = map(int, input().split())
    edges.append((u, v))
    max_node = max(max_node, u, v)

# 初始化邻接表并填充
mega_lst = [[] for _ in range(max_node + 1)]
for u, v in edges:
    mega_lst[u].append(v)
    mega_lst[v].append(u)

print(mega_lst)

方案3:利用Networkx直接导出邻接表

如果已经使用Networkx,可直接通过库方法生成邻接表,代码更简洁:

import networkx as nx

E = int(input())
G = nx.Graph()
for _ in range(E):
    u, v = map(int, input().split())
    G.add_edge(u, v)

# 按节点ID排序后生成邻接表
sorted_nodes = sorted(G.nodes())
mega_lst = [list(G.neighbors(node)) for node in sorted_nodes]

print(mega_lst)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:55:23