测验题 - 边为M的最短路径问题 - Python

189 篇文章 3 订阅

问题描述:

   给定一张有N个节点的图,每两点间都有一条道路相连。求出任意两点间经过M条边的最短路径距离 ,并输出出来。

你需要设计这样一个函数:

res[][] Solve(N, M, map[][])

注意: map必然是N * N的二维数组,且map[i][j] == map[j][i]map[i][i] == 0-1e8 <= map[i][j] <= 1e8。(道路全部是无向边无自环2 <= N <= 100,2 <= M <= 1e6。要求时间复杂度控制在O(N^3*log(M))

map数组表示了一张稠密图,其中任意两个不同节点i,j间都有一条边,边的长度为map[i][j]N表示其中的节点数
你要返回的数组也必然是一个N * N的二维数组,表示从i出发走到j,经过M条边的最短路径。
你的路径中应考虑包含重复边的情况。
样例:

N = 3
M = 2
map = {
 {0, 2, 3},
 {2, 0, 1},
 {3, 1, 0}}

输出结果result为:

result = {
 {4, 4, 3},
 {4, 2, 5},
 {3, 5, 2}}

问题分析:

   使用深度优先搜索方法,思路,从一个点出发,每层选择一个点进行累计,进行深度搜索,搜索到头,就回溯到上一个位置,再进行深度搜索,直至结束。

Python3实现:

# @Time   :2018/7/28
# @Author :LiuYinxing
# 深度优先搜索


def Sove(N, M, map):

    minStep = float('inf')  # 定义一个中间变量,用于保存每对顶点M步的最短距离

    def dfs(start, end, N, M, dis, steps):
        nonlocal minStep  # 使用外界变量
        if steps == M:  # 更新最优值,并设置递归出口
            if start == end:
                minStep = min(minStep, dis)
            return

        for next in range(N):  # 深度搜索
            if next == start:continue  # 如果自己那么一定为0,也就没必要进行了。
            rdis = dis + map[start][next]
            dfs(next, end, N, M, rdis, steps + 1)

    res = [[None] * N for _ in range(N)]
    for i in range(N):
        for j in range(i, N):
            dfs(i, j, N, M, 0, 0)
            res[i][j] = res[j][i] = minStep
            minStep = float('inf')  # 恢复到最大值
    return res


if __name__ == '__main__':
    N, M, map = 3, 2, [[0, 2, 3], [2, 0, 1], [3, 1, 0]]
    res = Sove(N, M, map)
    for v in res:
        print(v)

有问题,请,批评指正哦,大神勿喷哦,自己只是学习整理。
参考链接:
[1]:blog.csdn.net/u012465304/article/details/81180707

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值