博客
关于我
最短路 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 | doit,一个非常实用的 Python 库!
    查看>>
    python | easyocr,一个超厉害的 关于OCR的 Python 库!
    查看>>
    python | fastFM,一个高级的 Python 库!
    查看>>
    python | feature_engine,一个实用的 Python 库!
    查看>>
    python | filelock,一个超酷的 Python 库!
    查看>>
    python | fire,一个强大的 Python 库!
    查看>>
    python | flanker,一个神奇的 Python 库!
    查看>>
    python | flower,一个强大的 Python 库!
    查看>>
    python | funcy,一个超强的 提供函数式编程工具 Python 库!
    查看>>
    python | ggplot,一个超强的 Python 库!
    查看>>
    python | grab,一个强大的 Python 库!
    查看>>
    python | gunicorn,一个非常实用的 Python 库!
    查看>>
    python | h5py,一个无敌的关于 HDF5 的 Python 库!
    查看>>
    python | huey,一个非常厉害的 任务调度 Python 库!
    查看>>
    python | hypothesis,一个有趣的 Python 库!
    查看>>
    python | Indico,一个超酷的 Python 库!
    查看>>
    python | isort,一个有趣的 自动整理导入语句 的Python 库!
    查看>>
    python | jinja,一个超酷的 Python 库!
    查看>>
    python | joblib,一个强大的 Python 库!
    查看>>
    python调用git bash_Python学习第70课-用Git Bash在命令行打开sublime
    查看>>