博客
关于我
最短路 dijkstra 学习、代码实现
阅读量:395 次
发布时间:2019-03-05

本文共 1810 字,大约阅读时间需要 6 分钟。

为了解决这个问题,我们需要找到探险家用最少金币娶到酋长的女儿的方法。酋长的女儿的物品编号为2,而探险家的编号为1。我们需要计算从节点1到节点2的最短路径,考虑地位差距和替代品的优惠价格。

方法思路

  • 问题分析:我们需要找到最小的金币数,使得探险家能够购买到酋长的女儿的物品。每个物品可以通过替代品降低价格,但地位差距不能超过限制。
  • 图的构建:将每个物品作为节点,替代品作为边,边权重为优惠价格。节点i和j之间有边当且仅当它们的地位差距不超过M。
  • Dijkstra算法:使用Dijkstra算法从节点1(探险家)出发,找到到节点2(酋长的女儿)的最短路径。
  • 解决代码

    import heapq
    def main():
    import sys
    input = sys.stdin.read().split()
    idx = 0
    M = int(input[idx]); idx +=1
    N = int(input[idx]); idx +=1
    INF = float('inf')
    a = [INF] * (N + 1)
    level = [0] * (N + 1)
    for i in range(2, N+1):
    P = int(input[idx]); idx +=1
    L = int(input[idx]); idx +=1
    X = int(input[idx]); idx +=1
    a[i] = P
    level[i] = L
    for _ in range(X):
    T = int(input[idx]); idx +=1
    V = int(input[idx]); idx +=1
    j = T + 1 # 替代品是物品编号
    if a[j] > a[i] + V:
    a[j] = a[i] + V
    # Dijkstra算法
    # 节点1到节点2的最短路径
    heap = []
    dist = [INF] * (N + 1)
    dist[1] = 0
    heapq.heappush(heap, (0, 1))
    while heap:
    current_dist, u = heapq.heappop(heap)
    if u == 2:
    break
    if current_dist > dist[u]:
    continue
    for v in range(1, N+1):
    if v == u:
    continue
    if level[u] - level[v] > M or level[v] - level[u] > M:
    continue
    new_dist = current_dist + a[u] # 这里可能有问题,需重新审视
    if new_dist < dist[v]:
    dist[v] = new_dist
    heapq.heappush(heap, (new_dist, v))
    print(dist[2])
    if __name__ == "__main__":
    main()

    代码解释

  • 输入处理:读取输入数据,包括地位差距限制M和物品数量N,然后读取每个物品的信息和替代品。
  • 初始化图:构建每个物品的价格和替代品优惠价格,并计算每个物品的最短距离。
  • Dijkstra算法:使用优先队列来处理节点,计算从节点1到节点2的最短路径。每次从当前最短距离中选出一个节点,更新其邻居节点的距离。
  • 输出结果:打印从节点1到节点2的最短距离,即最少需要的金币数。
  • 通过这种方法,我们可以高效地找到最小的金币数,使探险家能够娶到酋长的女儿。

    转载地址:http://qdkzz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现reverse letters反向字母算法(附完整源码)
    查看>>
    Objective-C实现ripple adder涟波加法器算法(附完整源码)
    查看>>
    Objective-C实现RodCutting棒材切割最大利润算法(附完整源码)
    查看>>
    Objective-C实现Romberg算法(附完整源码)
    查看>>
    Objective-C实现round robin循环赛算法(附完整源码)
    查看>>
    Objective-C实现RRT路径搜索(附完整源码)
    查看>>
    Objective-C实现rsa 密钥生成器算法(附完整源码)
    查看>>
    Objective-C实现RSA密码算法(附完整源码)
    查看>>
    Objective-C实现RSA素因子算法(附完整源码)
    查看>>
    Objective-C实现runge kutta龙格-库塔法算法(附完整源码)
    查看>>
    Objective-C实现segment tree段树算法(附完整源码)
    查看>>
    Objective-C实现selection sort选择排序算法(附完整源码)
    查看>>
    Objective-C实现sha256算法(附完整源码)
    查看>>
    Objective-C实现shell sort希尔排序算法(附完整源码)
    查看>>
    Objective-C实现sieve of Eratosthenes埃拉托色尼筛法算法(附完整源码)
    查看>>
    Objective-C实现sieveOfEratosthenes埃拉托色尼筛法求素数算法 (附完整源码)
    查看>>
    Objective-C实现SinglyLinkedList单链表算法(附完整源码)
    查看>>
    Objective-C实现skew heap倾斜堆算法(附完整源码)
    查看>>
    Objective-C实现Skip List跳表算法(附完整源码)
    查看>>
    Objective-C实现slack message松弛消息算法(附完整源码)
    查看>>