题目地址:

https://www.acwing.com/problem/content/1128/

在nnn个人中,某些人的银行账号之间可以互相转账。这些人之间转账的手续费各不相同。给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问AAA最少需要多少钱使得转账后BBB收到100100100元。

输入格式:
第一行输入两个正整数n,mn,mn,m,分别表示总人数和可以互相转账的人的对数。以下mmm行每行输入三个正整数x,y,zx,y,zx,y,z,表示标号为xxx的人和标号为yyy的人之间互相转账需要扣除zz%z的手续费(z<100z<100z<100)。最后一行输入两个正整数A,BA,BA,B。数据保证AAA与BBB之间可以直接或间接地转账。

输出格式:
输出AAA使得BBB到账100100100元最少需要的总费用。精确到小数点后888位。

数据范围:
1≤n≤20001≤n≤20001≤n≤2000
m≤105m≤10^5m≤105

假设AAA一开始手里有111块钱,将转账看成是在图上走过一条边,这条边的权是1−z%1-z\%1−z%,并且每走过一条边,就乘上这个权值。那么相当于要问,从AAA走到BBB的最大权值乘积是多少。因为1−z%>01-z\%>01−z%>0,将每条边的权值取对数再取反,就将问题转为非负权无向图的最短路问题,可以用Dijkstra算法来做。对该图而言,可以用朴素版Dijkstra算法来做。参考https://blog.csdn.net/qq_46105170/article/details/113816110。代码如下:

#include <iostream>
#include <cstring>
using namespace std;const int N = 2010;
int n, m, S, T;
double g[N][N];
double dist[N];
bool st[N];void dijkstra() {dist[S] = 1;for (int i = 1; i <= n; i++) {int t = -1;for (int j = 1; j <= n; j++)if (!st[j] && (t == -1 || dist[t] < dist[j]))t = j;// 搜到终点了就可以直接返回了if (t == T) return;st[t] = true;for (int j = 1; j <= n; j++)if (!st[j] && dist[j] < dist[t] * g[t][j])dist[j] = dist[t] * g[t][j];}
}int main() {cin >> n >> m;for (int i = 0; i < m; i++) {int a, b, c;scanf("%d%d%d", &a, &b, &c);double z = (100.0 - c) / 100;g[a][b] = g[b][a] = max(g[a][b], z);}cin >> S >> T;dijkstra();printf("%.8lf\n", 100 / dist[T]);return 0;
}

时间复杂度O(mlog⁡n)O(m\log n)O(mlogn),空间O(n2)O(n^2)O(n2)。

【ACWing】1126. 最小花费相关推荐

  1. 算法提高课-图论-单源最短路的建图方式-AcWing 1126. 最小花费:dijkstra求最长路

    题目分析 来源:acwing 分析: 链条转移:start * (1-w1) * (1- w2) * (1- w3) -(1-wn) = 100,要start最小,则w =(1-w1) * (1- w ...

  2. Acwing 1126. 最小花费【图论、单源最短路】

    在 n 个人中,某些人的银行账号之间可以互相转账. 这些人之间转账的手续费各不相同. 给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问 A 最少需要多少钱使得转账后 B 收到 100 元 ...

  3. hdu4122 制作月饼完成订单的最小花费

    题意:       有一个加工厂加工月饼的,这个工厂一共开业m小时,2000年1月1日0点是开业的第一个小时,每个小时加工月饼的价钱也不一样,然后每个月饼的保质期都是t天,因为要放在冰箱里保存,所以在 ...

  4. ZOJ3715 竞选班长求最小花费

    题意:       有n个小朋友竞选班长,一号想当班长,每个人都必须选择一个人当班长,并且不可以选择自己,并且每个人都有一个权值ai,这个权值就是如果1想让这个人改变主意选择自己当班长就得给他ai个糖 ...

  5. LeetCode-动态规划基础题-746. 使用最小花费爬楼梯

    描述 746.使用最小花费爬楼梯 数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始). 每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应 ...

  6. 1230: 最小花费(spfa)

    1230: 最小花费 时间限制: 1 Sec 内存限制: 128 MB 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除 ...

  7. LeetCode Algorithm 746. 使用最小花费爬楼梯

    746. 使用最小花费爬楼梯 Ideas 首先确定题目类型,爬楼梯问题,并且给定了状态转移的限制,其实就已经可以确定状态转移方程了. 然后题目说可以从下标为0或下标为1的台阶开始爬,所以我们可以定义两 ...

  8. 【例4-4】最小花费

    [例4-4]最小花费 链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1344 时间限制: 1000 ms         内存限制: 65536 ...

  9. 算法题目——使用最小花费爬楼梯(动态规划)

    题目链接:746.使用最小花费爬楼梯 方法:动态规划 假设数组cost的长度为n,则n个阶梯分别对应下标0到n- 1,楼层顶部对应下标n,问题等价于计算达到下标n的最小花费.可以通过动态规划求解. 创 ...

最新文章

  1. python 图片对比文件夹_初学Python-找出文件夹下的所有图片
  2. 动态DNS——本质上是IP变化,将任意变换的IP地址绑定给一个固定的二级域名。不管这个线路的IP地址怎样变化,因特网用户还是可以使用这个固定的域名 这样看的话,p2p可以用哇...
  3. STL 里 resize 和 reserve 的区别
  4. .net ef core 领域设计代码转换(上篇)
  5. c++ 编写函数返回两个值最小值_结合实例来分析SQL的窗口函数
  6. 服务器对象错误quot;ASP 0177:80040154quot;Server.CreateObject
  7. 资源放送丨《容灾体系建设之“独孤九式”》PPT视频
  8. 还不理解“分布式事务”?这篇给你讲清楚!
  9. lua mysql发包_如何发包
  10. 从零基础入门Tensorflow2.0 ----二、4.1 wide deep 模型(函数式API)
  11. Vue中 引入外部字体并使用
  12. 谷歌离线地图开发教程
  13. 街道设计导则与城市道路系统的优化提升:从通行能力到空间品质的转变
  14. java中正则验证邮箱手机格式
  15. 超详细的微信公众号创建与管理教程
  16. 实例解析云计算的概念
  17. 向量检索milvus之一:以图搜图
  18. 置信传播算法(Belief Propagation)简介
  19. 【渝粤教育】电大中专公共基础课程作业 题库
  20. 高性能定时器--时间轮/多级时间轮

热门文章

  1. 木头QQ2012显IP显隐身版 v9.1.0官网优化版
  2. android开发工具 AndroidUtilCode
  3. 2020-08-13
  4. springboot项目集成java接口文档生成工具knife4j
  5. 1111112222
  6. 服务器租用对比托管的优势
  7. linux逻辑卷的作用,Linux LVM逻辑卷详解
  8. visual studio 编辑器窗口分屏
  9. c语言万年历输入年月日星期几,菜鸟写的一个万年历(计算输入日期是星期几)...
  10. 汇编一日一学(12)--求最小偶数