Python无第三方库实现图:验证无向图代码理解与节点边添加逻辑疑问
基于字典实现图结构的问题解答
你对这段示例代码的理解完全正确:
- 该代码实现的确实是无向图的邻接表结构
- 第6行代码的作用,是为起始节点
node的邻接列表,添加指向邻接节点adjacent_node的路径记录 - 第7行代码的作用,是为邻接节点
adjacent_node的邻接列表,反向添加指向起始节点node的路径记录
这种双向记录的逻辑,刚好匹配无向图“边无方向、两节点互通”的特性:比如节点A和节点B连边,既可以从A走到B,也可以从B走到A。
关于你提到的存储逻辑疑问,明确拆解如下:
- 这段代码里的
Graph.dict本质是邻接表存储结构,它并不是只存储孤立的节点信息:字典的每个键代表图中的一个节点,键对应的列表值,存储的就是该节点所有可直接到达的邻接节点。边的信息本身就是和节点绑定在邻接表里存储的,不需要单独拆分实现addEdges逻辑。 - 当前的
add方法已经同时完成了节点和边的新增操作:因为用了defaultdict(list),当调用graph.add('1','2')时,如果'1'、'2'是从未出现过的新节点,字典会自动给这两个键初始化空列表,再把对应邻接节点加入列表——相当于两个新节点被纳入图结构的同时,两点之间的关联边就已经被完整记录,不需要额外步骤。 - 如果你需要实现有向图,改动非常简单:只需要删掉第7行的反向添加逻辑即可。有向图的边是单向的,比如存在从A指向B的边,只需要在A的邻接列表中加入B,不需要在B的邻接列表里反向添加A。
调整后的有向图
add方法逻辑参考:def add(graph, start_node, end_node): # 仅记录从起点到终点的单向路径,不做反向添加 graph.dict[start_node].append(end_node)
内容的提问来源于stack exchange,提问作者henee
相关产品推荐
相关产品推荐

