问题描述:
给定一张有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