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

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

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

方法思路

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

    import heapqdef 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/

    你可能感兴趣的文章
    python | orange3,一个神奇的 Python 库!
    查看>>
    python | pdfminer,一个神奇的 关于PDF 文件的 Python 库!
    查看>>
    python | pendulum,一个有趣的 日期和时间 Python 库!
    查看>>
    python | pluginbase,一个神奇的 关于插件框架 的Python 库!
    查看>>
    python | ply,一个无敌的 词法和语法分析工具 的Python 库!
    查看>>
    python | py2exe,一个超酷的 Python 库!
    查看>>
    python | pyautogui,一个超酷的 Python 库!
    查看>>
    python | pybaobabdt,一个超强的 决策树可视化 Python 库!
    查看>>
    python | pycco,一个神奇的 Python 库!
    查看>>
    python | pyg2plot,一个有趣的 数据可视化 Python 库!
    查看>>
    python | pymc,一个超强的 Python 库!
    查看>>
    python | pynsist,一个强大的 Python 库!
    查看>>
    python | pyparsing,一个强大的 Python 库!
    查看>>
    python | pyqtgraph,一个神奇的 Python 库!
    查看>>
    python读取文本文件数据
    查看>>
    python | Python mock对象与测试替身
    查看>>
    python | Python pandas实现数据追加和合并的最佳方法
    查看>>
    python | Python 中检查一个数字是否是三态数
    查看>>
    python | Python 蒙特卡洛模拟
    查看>>
    python | python-docx,一个超厉害的 Python 库!
    查看>>