首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >给定边的最短路径

给定边的最短路径
EN

Stack Overflow用户
提问于 2020-11-09 18:47:19
回答 1查看 108关注 0票数 0

我想使用k边从源(U)找到最短路径。这个solution似乎可以工作,但是它搜索到给定节点v的具有k边的路径。如果在到达v之前就覆盖了k边缘,该怎么办?我只需要从覆盖k边缘的u覆盖的所有路径中选择最短路径。不需要访问v

以上链接中的代码:

代码语言:javascript
运行
复制
# Python3 program to find shortest path 
# with exactly k edges 

# Define number of vertices in the graph 
# and inifinite value 

# A naive recursive function to count 
# walks from u to v with k edges 
def shortestPath(graph, u, v, k): 
    V = 4
    INF = 999999999999
    
    # Base cases 
    if k == 0 and u == v: 
        return 0
    if k == 1 and graph[u][v] != INF: 
        return graph[u][v] 
    if k <= 0: 
        return INF 

# Initialize result 
    res = INF 

# Go to all adjacents of u and recur 
    for i in range(V): 
        if graph[u][i] != INF and u != i and v != i: 
            rec_res = shortestPath(graph, i, v, k - 1) 
            if rec_res != INF: 
                res = min(res, graph[u][i] + rec_res) 
    return res 

# Driver Code 
if __name__ == '__main__': 
    INF = 999999999999
    
    # Let us create the graph shown 
    # in above diagram 
    graph = [[0, 4, 2, 6, 5], 
            [INF, 0, 4, 2, 5], 
            [INF, INF, 0, 4, 3], 
            [INF, INF, INF, 0, 3],
            [INF, INF, INF, INF, 0]] 
    u = 0
    v = 4
    k = 3
    print("Weight of the shortest path is", 
            shortestPath(graph, u, v, k)) 
EN

Stack Overflow用户

回答已采纳

发布于 2020-11-09 23:44:53

您可能可以修复该代码(通过根本不传入或查看v -参见下文)。但我建议简单地修改Dijkstra的算法,至多从起始节点开始探索3条边。Dijkstra从起点开始查找所有最短路径。当路径到达它们的第三条边时,简单地停止它(这将需要你保持边的计数以及距离)。

修改上面的代码也可以,但肯定更慢,因为除非图形是一棵树,否则您将多次查看每条边。

代码语言:javascript
运行
复制
INF = 999999999999
def nearest_in_k_steps(graph, u, k): 
    print(f"Entering {u}, {k} steps remaining")
    V = len(graph)
   
    # Base case
    if k == 0: 
        return 0, u

    # Initialize result 
    best_dist = INF 
    best_target = None

    # Go to all adjacents of u and recurse 
    for i in range(V): 
        if graph[u][i] != INF and u != i: 
            candidate_dist, candidate_target = nearest_in_k_steps(graph, i, k - 1) 
            candidate_dist += graph[u][i]
            if candidate_dist < best_dist:
                print(f"Hmm, path via {i} (d={candidate_dist}) is better than via {best_target} (d={best_dist})")
                best_dist = candidate_dist
                best_target = candidate_target

    print(f"Returning from {u}, {k} steps remaining: d={best_dist} to {best_target}")
    return best_dist, best_target

# Driver Code 
if __name__ == '__main__': 
    # Let us create the graph shown 
    # in above diagram 
    graph = [[0,    4,   2,   6,   5], 
            [INF,   0,   4,   2,   5], 
            [INF, INF,   0,   4,   3], 
            [INF, INF, INF,   0,   3],
            [INF, INF, INF, INF,   0]] 
    start = 0
    steps = 3
    nearest_dist, nearest_target = nearest_in_k_steps(graph, start, steps)
    print(f"Node {nearest_target} is the nearest {steps}-step neighbor of {start}: distance = {nearest_dist}")

请注意,这里有几个打印件,它们只是为了帮助您理解代码是如何工作的。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64750149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档