博客
关于我
【最短路Dijkstra】【图论】最小花费
阅读量:361 次
发布时间:2019-03-04

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

为了解决这个问题,我们需要找到一个路径,使得A转账给B后B收到100元的总费用最少。我们可以将这个问题看作是一个图的最短路径问题,但由于涉及百分比扣除,我们需要用一种变形后的最短路径算法来解决。

方法思路

  • 问题分析:我们需要计算从A转到B的最优路径,使得在扣除手续费后B收到100元。每次转账都会扣除一定的百分比手续费,因此我们需要找到使总扣除费率最大的路径。

  • 转换问题:将每次转账的百分比手续费转换为保留比例,然后将问题转化为寻找从A到B的最大扣除费率路径。这样,总费用最少的路径就是使得保留比例最大的路径。

  • 算法选择:使用优先队列(大顶堆)来实现一种变形后的Dijkstra算法。我们记录从A到每个节点的最大扣除费率,并不断更新邻居节点的最大扣除费率。

  • 实现步骤

    • 读取输入数据并构建图的邻接表。
    • 初始化最大保留比例数组和优先队列。
    • 使用优先队列处理每个节点,更新邻居节点的最大保留比例。
    • 计算最终的金额,使得B收到100元。
  • 解决代码

    import heapqdef main():    import sys    input = sys.stdin.read    data = input().split()        idx = 0    n = int(data[idx])    idx += 1    m = int(data[idx])    idx += 1    graph = [[] for _ in range(n + 1)]    for _ in range(m):        x = int(data[idx])        idx += 1        y = int(data[idx])        idx += 1        z = float(data[idx])        idx += 1        ratio = 1.0 - z / 100.0        graph[x].append((y, ratio))        graph[y].append((x, ratio))        A = int(data[idx])    idx += 1    B = int(data[idx])    idx += 1    max_ratio = [0.0] * (n + 1)    max_ratio[A] = 1.0    heap = []    heapq.heappush(heap, (-1.0, A))    while heap:        current_ratio = -heap[0][0]        u = heap[0][1]        if u == B:            break        if current_ratio < max_ratio[u]:            continue        for v, ratio in graph[u]:            new_ratio = current_ratio * ratio            if new_ratio > max_ratio[v]:                max_ratio[v] = new_ratio                heapq.heappush(heap, (-new_ratio, v))    required = 100.0 / (1.0 - max_ratio[B])    print("{0:.8f}".format(required))if __name__ == "__main__":    main()

    代码解释

  • 读取输入:使用sys.stdin.read读取所有输入数据,并将其拆分为列表处理。
  • 构建图邻接表:读取每条转账关系,构建图的邻接表,其中每条边的权重是转账后的保留比例。
  • 初始化变量max_ratio数组记录从A到每个节点的最大扣除费率,优先队列用于处理节点,按当前最大保留比例排序。
  • 处理优先队列:每次取出当前最大保留比例的节点,更新其邻居节点的最大保留比例,并将邻居节点加入队列。
  • 计算结果:根据最大保留比例计算A需要支付的金额,使得B收到100元,并输出结果,精确到8位小数。
  • 转载地址:http://muug.baihongyu.com/

    你可能感兴趣的文章
    OpenCV与AI深度学习 | 如何在 Docker 容器中使用 GPU
    查看>>
    OpenCV与AI深度学习 | 实战 | OpenCV中更稳更快的找圆方法--EdgeDrawing使用演示(详细步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战 | OpenCV传统方法实现密集圆形分割与计数(详细步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战 | OpenCV实现扫描文本矫正应用与实现详解(附源码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 使用OpenCV和Streamlit搭建虚拟化妆应用程序(附源码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 使用OpenCV确定对象的方向(附源码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 使用YOLOv8 Pose实现瑜伽姿势识别
    查看>>
    OpenCV与AI深度学习 | 实战 | 使用YoloV8实例分割识别猪的姿态(含数据集)
    查看>>
    OpenCV与AI深度学习 | 实战 | 使用姿态估计算法构建简单的健身训练辅助应用程序
    查看>>
    OpenCV与AI深度学习 | 实战 | 基于OpenCV和K-Means聚类实现颜色分割(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 基于YoloV5和Mask RCNN实现汽车表面划痕检测(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 基于YOLOv9+SAM实现动态目标检测和分割(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 基于YOLOv9和OpenCV实现车辆跟踪计数(步骤 + 源码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 文本图片去水印--同时保持文本原始色彩(附源码)
    查看>>
    OpenCV与AI深度学习 | 实战—使用YOLOv8图像分割实现路面坑洞检测(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战篇——基于YOLOv8和OpenCV实现车速检测(详细步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战|OpenCV实时弯道检测(详细步骤+源码)
    查看>>
    OpenCV与AI深度学习 | 实践教程|旋转目标检测模型-TensorRT 部署(C++)
    查看>>
    OpenCV与AI深度学习 | 工业缺陷检测中数据标注需要注意的几个事项
    查看>>
    OpenCV与AI深度学习 | 干货 | 深度学习模型训练和部署的基本步骤
    查看>>