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

    你可能感兴趣的文章
    NLP学习笔记:使用 Python 进行NLTK
    查看>>
    NLP:使用 SciKit Learn 的文本矢量化方法
    查看>>
    Nmap扫描教程之Nmap基础知识
    查看>>
    Nmap端口扫描工具Windows安装和命令大全(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    NMAP网络扫描工具的安装与使用
    查看>>
    NMF(非负矩阵分解)
    查看>>
    NN&DL4.1 Deep L-layer neural network简介
    查看>>
    NN&DL4.3 Getting your matrix dimensions right
    查看>>
    NN&DL4.8 What does this have to do with the brain?
    查看>>
    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    查看>>
    No Datastore Session bound to thread, and configuration does not allow creation of non-transactional
    查看>>
    No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
    查看>>
    No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc
    查看>>
    No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
    查看>>
    No module named cv2
    查看>>
    No module named tensorboard.main在安装tensorboardX的时候遇到的问题
    查看>>
    No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
    查看>>
    No new migrations found. Your system is up-to-date.
    查看>>
    No qualifying bean of type XXX found for dependency XXX.
    查看>>
    No resource identifier found for attribute 'srcCompat' in package的解决办法
    查看>>