Luogu P1576 最小花费

题目背景

题目描述

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

输入输出格式

输入格式:

第一行输入两个正整数n,m,分别表示总人数和可以互相转账的人的对数。

以下m行每行输入三个正整数x,y,z,表示标号为x的人和标号为y的人之间互相转账需要扣除z%的手续费 (z<100)。

最后一行输入两个正整数A,B。数据保证A与B之间可以直接或间接地转账。

输出格式:

输出A使得B到账100元最少需要的总费用。精确到小数点后8位。

输入输出样例

输入样例#1:

3 3
1 2 1
2 3 2
1 3 3
1 3

输出样例#1:

103.07153164

说明

1<=n<=2000

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 double a[2001][2001],dis[2001]={0},minn;
 4 int n,m,i,j,k,x,y,f[2001]={0};
 5 void init () //定义该函数以处理录入数据
 6 {
 7     cin>>n/*总人数*/>>m/*可以相互转账的人的对数*/;
 8     for(i=1;i<=m;i++)
 9     {
10         scanf("%d%d",&j,&k);/*录入可以相互转账的两人的序号*/
11         scanf("%lf",&a[j][k]);/*将这两人的手续费转存入该数组中*/
12         a[j][k]=(100-a[j][k])/100;/*改变手续费的形式(即,将原来的扣除百分比 转换 为剩余百分比)*/
13         a[k][j]=a[j][k];/*a传给b的手续费等于b传给a的手续费*/
14     }
15     cin>>x>>y;/*输入要求计算的两人*/
16 }
17 void dijkstra(int x)/*定义该函数以确定最小的手续费*/
18 {
19     for(i=1;i<=n;i++)/*该循环用以将手续费重新赋值给dis数组,f机制用于判断是否以确定出最小值*/
20     {
21         dis[i]=a[x][i];/*赋值*/
22         dis[x]=1;/*x转账给x的手续费为1(即没有手续费)*/
23         f[x]=1;/*x以被确定为本轮中必须要走的最小中转点*/
24     }
25     for(i=1;i<=n-1;i++)/*该循环用以重新定义从a点转账到b点的手续费*/
26     {
27         minn=0;/*剩余最少为0*/
28         for(j=1;j<=n;j++)/*该循环用以穷举*/
29         {
30             if(f[j]==0&&dis[j]>minn)/*如果j点并未被确定,并且x转账到j点所能余留的存款最多*/
31             {
32                 k=j;/*将j点赋值给k点*/
33                 minn=dis[j];/*minn用以记录x到j点所需的"最小“手续费,类似于广搜*/
34             }
35         }
36         f[k]=1;/*声明k点被确定*/
37         if(k==y)
38         {
39             break;
40         }
41         for(j=1;j<=n;j++)
42         {
43             if(f[j]==0&&dis[k]*a[k][j]>dis[j])/*如果j点没被确定并且x到k点再到j点的所能余留下的存款比x直接转给j点要多*/
44             {
45                 dis[j]=dis[k]*a[k][j];/*重新定义x到j点的最小手续费*/
46             }
47         }
48     }
49 }
50 int main()
51 {
52     init();
53     dijkstra(x);
54     printf("%0.8lf",100/dis[y]);
55     return 0;
56 }
时间: 2024-10-10 02:28:42

Luogu P1576 最小花费的相关文章

洛谷 P1576 最小花费 dijkstar

P1576 最小花费 题目背景 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元. 输入输出格式 输入格式: 第一行输入两个正整数n,m,分别表示总人数和可以互相转账的人的对数. 以下m行每行输入三个正整数x,y,z,表示标号为x的人和标号为y的人之间互相转账需要扣除z%的手续费 (z<100). 最后一行输入两个正整数A,B.数据保证A与B之间可以直接或

洛谷—— P1576 最小花费

P1576 最小花费 题目背景 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元. 输入输出格式 输入格式: 第一行输入两个正整数n,m,分别表示总人数和可以互相转账的人的对数. 以下m行每行输入三个正整数x,y,z,表示标号为x的人和标号为y的人之间互相转账需要扣除z%的手续费 (z<100). 最后一行输入两个正整数A,B.数据保证A与B之间可以直接或

P1576 最小花费

----------------------------------- 这道题就是图论最短路,但是我们要改一下一些细节 比如说,因为这是算汇率,我们的初始化就要是0 我们还要改一改松弛操作 ----------------------------------- 还有,题目上给的是汇率(而且是整形) 所以说我们要改成小数 ----------------------------------- 以及,汇率是我们在操作中的“损失” 那么,我们留下的部分就是1-汇率(易得) --------------

第四届CCF软件能力认证(CSP2015) 第五题(最小花费)题解

[问题描述] C国共有$n$个城市.有$n-1$条双向道路,每条道路连接两个城市,任意两个城市之间能互相到达.小R来到C国旅行,他共规划了$m$条旅行的路线, 第$i$条旅行路线的起点是$s_i$,终点是$t_i$.在旅行过程中,小R每行走一单位长度的路需要吃一单位的食物.C国的食物只能在各个城市中买到,而且不同城市的食物价格可能不同. 然而,小R不希望在旅行中为了购买较低价的粮食而绕远路,因此他总会选择最近的路走.现在,请你计算小R规划的每条旅行路线的最小花费是多少. [输入格式] 第一行包含

Poj 2516 Minimum Cost (最小花费最大流)

题目链接: Poj  2516  Minimum Cost 题目描述: 有n个商店,m个仓储,每个商店和仓库都有k种货物.嘛!现在n个商店要开始向m个仓库发出订单了,订单信息为当前商店对每种货物的需求量.不同的商店从不同的仓库购买不同货物花费不同,问是不是能满足所有商店的要求,如果能商店花费总和最小为多少? 解题思路: 简单的费用流,要跑K次最小花费最大流,每次只对一种货物建图跑费用流.每次建图以0为源点, [1,m]为仓库, [m+1, n+m]为商店, n+m+1为汇点.0与[1,m]连边,

FZU 2197 最小花费 (模拟)

[题目链接]:click here~~ [题目大意]: 给一个长度为n(n <= 10^5)的"01"串,你可以任意交换一个为0的位和一个为1的位,若这两位相邻,花费为X,否则花费为Y.求通过若干次交换后将串中的"1"全部变换到"0"前面的最小花费. [解题思路]:看到题以为是道考算法的,想了想,朴素算法O(n^2)绝逼超时啊~~其实模拟一下,因为达到最终状态的只有一种,因此移动的步数是一定的,所以每次交换最前面的0和最后面的1,然后分别记

把一个序列转换成非严格递增序列的最小花费 POJ 3666

1 //把一个序列转换成非严格递增序列的最小花费 POJ 3666 2 //dp[i][j]:把第i个数转成第j小的数,最小花费 3 4 #include <iostream> 5 #include <cstdio> 6 #include <cstdlib> 7 #include <algorithm> 8 #include <vector> 9 #include <math.h> 10 // #include <memory.

把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend

1 //把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend 2 //dp[i][j]:把第i个数转成第j小的数,最小花费 3 //此题与poj 3666相似 a[i]转换成a[i]-i 4 5 #include <iostream> 6 #include <cstdio> 7 #include <cstdlib> 8 #include <algorithm> 9 #include <

hdoj 3072 Intelligence System【求scc&amp;&amp;缩点】【求连通所有scc的最小花费】

Intelligence System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1904    Accepted Submission(s): 824 Problem Description After a day, ALPCs finally complete their ultimate intelligence system