博客
关于我
【最短路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/

    你可能感兴趣的文章
    NodeJS、NPM安装配置步骤(windows版本)
    查看>>
    NodeJS、NPM安装配置步骤(windows版本)
    查看>>
    nodejs下的express安装
    查看>>
    nodejs与javascript中的aes加密
    查看>>
    nodejs中Express 路由统一设置缓存的小技巧
    查看>>
    nodejs中express的使用
    查看>>
    Nodejs中搭建一个静态Web服务器,通过读取文件获取响应类型
    查看>>
    Nodejs中的fs模块的使用
    查看>>
    NodeJS使用淘宝npm镜像站的各种姿势
    查看>>
    NodeJs入门知识
    查看>>
    nodejs包管理工具对比:npm、Yarn、cnpm、npx
    查看>>
    NodeJs单元测试之 API性能测试
    查看>>
    nodejs图片转换字节保存
    查看>>
    nodejs在Liunx上的部署生产方式-PM2
    查看>>
    nodejs基于art-template模板引擎生成
    查看>>
    nodejs字符与字节之间的转换
    查看>>
    NodeJs学习笔记001--npm换源
    查看>>
    NodeJs学习笔记002--npm常用命令详解
    查看>>
    nodejs学习笔记一——nodejs安装
    查看>>
    vue3+Element-plus icon图标无法显示的问题(已解决)
    查看>>