博客
关于我
【SSL 2206&洛谷 P1576】最小花费【最短路 Dijkstra】【图论】
阅读量:309 次
发布时间:2019-03-03

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

为了解决这个问题,我们需要找到从A到B的最优转账路径,使得转账后B最终收到100元所需的最小初始金额。这个问题可以通过图论中的最长路径问题来解决,通过反向转换并使用Dijkstra算法来求解。

方法思路

  • 问题分析:我们需要找到从A到B的路径,使得在扣除手续费后,B最终收到100元。每一步转账都会扣除一定的百分比手续费,因此我们需要最大化每一步的转账效率。
  • 反向转换:将每条转账路径的权重取倒数,转化为从B到A的最短路径问题。这样,我们可以使用Dijkstra算法来找到最短路径,这相当于在原图中找到最长路径。
  • Dijkstra算法:使用优先队列来处理节点,找到从B到A的最短路径。每条边的权重是转换后的汇率。
  • 计算初始金额:找到最长路径的乘积,然后用100除以这个乘积,得到A的最小初始金额。
  • 解决代码

    import heapqdef main():    import sys    input = sys.stdin.read().split()    idx = 0    n = int(input[idx])    idx += 1    m = int(input[idx])    idx += 1    INF = float('inf')    graph = [[] for _ in range(n + 1)]  # 1-based indexing    for _ in range(m):        x = int(input[idx])        idx += 1        y = int(input[idx])        idx += 1        z = float(input[idx])        idx += 1        rate = 1.0 / ((100 - z) / 100)        graph[x].append((y, rate))        graph[y].append((x, rate))    A = int(input[idx])    idx += 1    B = int(input[idx])    idx += 1    # Dijkstra from B to A    dist = [INF] * (n + 1)    dist[B] = 1.0    heap = []    heapq.heappush(heap, (0, B))    while heap:        current_dist, u = heapq.heappop(heap)        if u == A:            break        if current_dist > dist[u]:            continue        for v, w in graph[u]:            if dist[v] < dist[u] * w:                dist[v] = dist[u] * w                heapq.heappush(heap, (dist[v], v))    total_rate = dist[A]    min_A = 100.0 / total_rate    print("{0:.8f}".format(min_A))if __name__ == "__main__":    main()

    代码解释

  • 读取输入:从标准输入读取数据,包括总人数、转账对数、转账手续费、以及起始和结束节点。
  • 建立图:使用邻接表表示图,每条边的权重是转换后的汇率(1 / ((100 - 手续费%) / 100))。
  • Dijkstra算法:从B出发,使用优先队列处理节点,更新每个节点的最短路径。
  • 计算结果:找到从B到A的最短路径的总汇率,然后计算A的初始金额并输出结果,精确到小数点后8位。
  • 这个方法通过反向转换和Dijkstra算法高效地解决了问题,确保了找到最优转账路径并计算最小初始金额。

    转载地址:http://ebim.baihongyu.com/

    你可能感兴趣的文章
    Nginx配置——不记录指定文件类型日志
    查看>>
    nginx配置一、二级域名、多域名对应(api接口、前端网站、后台管理网站)
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    nginx配置全解
    查看>>
    Nginx配置参数中文说明
    查看>>
    nginx配置域名和ip同时访问、开放多端口
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>
    Nginx配置如何一键生成
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    Nginx配置文件nginx.conf中文详解(总结)
    查看>>
    Nginx配置负载均衡到后台网关集群
    查看>>
    ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
    查看>>
    NHibernate学习[1]
    查看>>
    NHibernate异常:No persister for的解决办法
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>