博客
关于我
最短路 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中xPath技术和BeautifulSoup的使用
    查看>>
    python中yield的用法详解——最简单,最清晰的解释
    查看>>
    python中‘set.intersection()‘的算法是什么?
    查看>>
    Python中一个图形中的多个绘图
    查看>>
    python中一个好的持久同步队列
    查看>>
    Python中不准确的对数
    查看>>
    python中什么是实例方法_在Python中创建实例方法对象的不同方法
    查看>>
    Python中使用cutecharts实现简单的手绘风格的图表
    查看>>
    python中使用dxfgrabber,解析dxf文件信息生成obj文件
    查看>>
    Python中使用ncmbot玩转网易云音乐
    查看>>
    Python中使用PIL快速实现二值图
    查看>>
    Python中使用PIL快速实现灰度图
    查看>>
    Python中使用pip install ncmbot时各种错误解决办法
    查看>>
    Python中使用requests和parsel爬取喜马拉雅电台音频
    查看>>
    Python中使用turtle绘制多个同心圆
    查看>>
    Python中使用turtle绘制棋盘详解
    查看>>
    Python中使用wordcloud生成漂亮的中文词云
    查看>>
    Python中使用wxpy定时机器人给微信好友发送每日一文
    查看>>
    Python中使用zip()并行迭代
    查看>>
    Python中使用推导式创建序列
    查看>>