博客
关于我
【最短路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深度学习 | OpenCV如何读取仪表中的指针刻度
    查看>>
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(一) :直接拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(三):基于特征匹配拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(二) :基于模板匹配拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(四):基于Stitcher类拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测(建议收藏!)
    查看>>
    OpenCV与AI深度学习 | PaddleOCR 2.9 发布, 正式开源文本图像智能分析利器
    查看>>
    OpenCV与AI深度学习 | SAM2(Segment Anything Model 2)新一代分割一切大模型介绍与使用(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | T-Rex Label !超震撼 AI 自动标注工具,开箱即用、检测一切
    查看>>
    OpenCV与AI深度学习 | YOLO11介绍及五大任务推理演示(目标检测,图像分割,图像分类,姿态检测,带方向目标检测)
    查看>>
    OpenCV与AI深度学习 | YOLOv10在PyTorch和OpenVINO中推理对比
    查看>>
    OpenCV与AI深度学习 | YOLOv11来了:将重新定义AI的可能性
    查看>>
    OpenCV与AI深度学习 | YOLOv8自定义数据集训练实现火焰和烟雾检测(代码+数据集!)
    查看>>
    OpenCV与AI深度学习 | YOLOv8重磅升级,新增旋转目标检测,又该学习了!
    查看>>
    OpenCV与AI深度学习 | 一文带你读懂YOLOv1~YOLOv11(建议收藏!)
    查看>>
    OpenCV与AI深度学习 | 五分钟快速搭建一个实时人脸口罩检测系统(OpenCV+PaddleHub 含源码)
    查看>>
    OpenCV与AI深度学习 | 什么是 COCO 数据集?
    查看>>
    OpenCV与AI深度学习 | 低对比度缺陷检测应用实例--LCD屏幕脏污检测
    查看>>
    OpenCV与AI深度学习 | 使用 MoveNet Lightning 和 OpenCV 实现实时姿势检测
    查看>>
    OpenCV与AI深度学习 | 使用 OpenCV 创建自定义图像滤镜
    查看>>