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

如何遍历图并返回最短路径?求简便实现方案

实现无权重图最短路径的简便方法

当然有啦!对于这种无权重的图,**广度优先搜索(BFS)**就是最适合的简便实现方式——它天然能保证找到的第一条路径就是最短路径,完全匹配你的需求。

下面直接给出可运行的代码实现,完全贴合你的示例要求:

from collections import deque

def travel(start, end, path_dict):
    # 处理起点和终点相同的特殊情况
    if start == end:
        return {'path': [start], 'length': 0}
    
    # 初始化队列,每个元素是(当前节点字符串, 当前路径列表)
    queue = deque()
    queue.append((str(start), [start]))
    # 记录已访问节点,避免循环
    visited = set()
    visited.add(str(start))
    
    while queue:
        current_node, current_path = queue.popleft()
        # 遍历当前节点的所有邻接节点
        for neighbor in path_dict[current_node]:
            neighbor_int = int(neighbor)
            # 找到终点,直接返回结果
            if neighbor_int == end:
                return {
                    'path': current_path + [neighbor_int],
                    'length': len(current_path)
                }
            # 未访问过的节点,加入队列继续遍历
            if neighbor not in visited:
                visited.add(neighbor)
                queue.append((neighbor, current_path + [neighbor_int]))
    
    # 如果终点不可达(你的示例里没这种情况,做个兜底)
    return {'path': [], 'length': -1}

# 测试你的示例
path_dict={ '0':['5'], '1':['4','5'], '2':['1','3','4'], '3':['1','4'], '4':['1'], '5':['0','2','3','4'], }
print(travel(1,5))  # 输出: {'path': [1, 5], 'length': 1}
print(travel(0,2))  # 输出: {'path': [0, 5, 2], 'length': 2}
print(travel(4,0))  # 输出: {'path': [4, 1, 5, 0], 'length': 3}

代码关键点说明:

  • 使用deque实现队列:因为BFS需要频繁从队头取出元素,deque.popleft()是O(1)操作,比列表的pop(0)(O(n))高效很多。
  • 路径实时记录:每个队列元素都带着从起点到当前节点的完整路径,这样一旦找到终点,就能直接拼接出最短路径,不用事后回溯。
  • 字符串转整数:你的邻接表键是字符串类型,所以处理时需要转成整数和输入的起点/终点匹配。
  • 已访问集合:避免重复访问节点,防止出现循环遍历的情况。

这个实现逻辑清晰,代码量不大,完全满足你的需求,而且时间复杂度在无权重图里是最优的~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 08:52:51