You need to enable JavaScript to run this app. Python无第三方库实现图:验证无向图代码理解与节点边添加逻辑疑问
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 16:54:03