从边列表构造邻接列表?

Construct an Adjacency List from a List of edges?

在图算法的上下文中,我们通常会得到一个方便的图表示(通常作为邻接列表或邻接矩阵)进行操作。

我的问题是,从给定的所有边的列表构造邻接列表的有效方法是什么?

为了问题的目的,假设边是一个元组列表(如python)并且(a,b)表示定向从a到b的边。

结合使用 itertools.groupby (docs)、排序和 dict 理解可以帮助您入门:

from itertools import groupby

edges = [(1, 2), (2, 3), (1, 3)]

adj = {k: [v[1] for v in g] for k, g in groupby(sorted(edges), lambda e: e[0])}
# adj: {1: [2, 3], 2: [3]}

这会按源节点对边进行排序和分组,并为每个源节点存储 list 个目标节点。现在您可以通过 adj[1]

访问 1 的所有相邻节点