题目背景

题目描述

在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

思路:

  用dis数组存起输入的:需要扣除z%的手续费,通过这个进行dijkstra

  不过有一点不同就是:

        普通的dijkstra是从dis数组里面往小里找,而这道题是从较大的里面找(因为最后输出的需要是最小的,那么剩余的百分之几一定是最大的)

坑点:

  松弛操作的时候也如此(思路):寻找从当前点出发到达另一点得到的百分比比之前剩余金额的百分比要大才能进行松弛操作

上代码:

#include <iostream>
#include <cstdio>
using namespace std; const int M = ;
int n,m,a,b,k;
double map[M][M],minn;
double dis[M];
bool vis[M]; void dijkstra(int start)
{
for(int i=; i<=n; i++)
dis[i]=map[start][i];
vis[start]=true;
dis[start]=;//必须进行赋值1,因为若进行更改将使用乘法(0*every==0)
for(int i=; i<n; i++)
{
minn=;
for(int j=; j<=n; j++)
if(!vis[j]&&dis[j]>minn) //寻找剩余金额最大的
minn=dis[j],k=j;
vis[k]=true;
if(k==b) break;//结束标志
for(int q=; q<=n; q++)
if(!vis[q]&&dis[q]<dis[k]*map[k][q])
dis[q]=dis[k]*map[k][q];//进行松弛
}
} int main()
{
double z;
scanf("%d%d",&n,&m);
for(int i=,x,y; i<=m; i++)
{
cin>>x>>y>>z;
map[x][y]=map[y][x]=(-z)/;//表示是原金额的百分之几
}
cin>>a>>b;
dijkstra(a);
printf("%.8lf\n",/dis[b]);
//绝对不能在dijkstra函数里面进行输出,因为有break操作,结果导致直接输出100
return ;
}

洛谷P1576 最小花费x的更多相关文章

  1. 洛谷—— P1576 最小花费

    P1576 最小花费 题目背景 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使 ...

  2. 洛谷P1576||最小花费||dijkstra||双向建边!!

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

  3. 洛谷 P1576 最小花费

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

  4. 浅谈SPFA——洛谷P1576 最小花费 题解

    想找原题请点击这里:传送门 原题: 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少 ...

  5. 洛谷 P1756 最小花费

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

  6. 洛谷4951 地震 bzoj1816扑克牌 洛谷3199最小圈 / 01分数规划

    洛谷4951 地震 #include<iostream> #include<cstdio> #include<algorithm> #define go(i,a,b ...

  7. Bzoj1486/洛谷P3199 最小圈(0/1分数规划+spfa)/(动态规划+结论)

    题面 Bzoj 洛谷 题解(0/1分数规划+spfa) 考虑\(0/1\)分数规划,设当前枚举到的答案为\(ans\) 则我们要使(其中\(\forall b_i=1\)) \[ \frac{\sum ...

  8. 网络流24题 第三题 - CodeVS1904 洛谷2764 最小路径覆盖问题 有向无环图最小路径覆盖 最大流 二分图匹配 匈牙利算法

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - CodeVS1904 题目传送门 - 洛谷2764 题意概括 给出一个有向无环图,现在请你求一些路径,这些路径 ...

  9. P1576 最小花费 洛谷

    https://www.luogu.org/problem/show?pid=1576 题目背景 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间 ...

随机推荐

  1. Shell初学(六)Linux Shell 时间运算以及时间差计算方法

    Linux Shell 时间运算以及时间差计算方法 时间的加减,以及时间差的计算. 1. 时间加减 这里处理方法,是将基础的时间转变为时间戳,然后,需要增加或者改变时间,变成 秒. 如:1990-01 ...

  2. # 组合数学-组合数+lacus定理

    目录 数论-组合数+lacus定理 组合数计算 lacus定理-大组合数取模 数论-组合数+lacus定理 组合数计算 为避免爆long long,\(20!\)就达到了long long 的范围,采 ...

  3. win10子系统Ubuntu重置

    重置: 在win10命令行下执行: lxrun /uninstall /full 安装: win+R打开bash 执行命令: lxrun /install /y

  4. Redis 高可用之哨兵模式(二)

    上一篇实际操作过程中遇到两个问题 问题一:虽然运行了3个sentinel容器,实际上只有一个sentinel运行 问题出现的原因很简单,三个sentinel用的是同一个挂载配置文件,容器内部的更改直接 ...

  5. 谷歌浏览器(Chrome)离线包的下载方法!

    谷歌浏览器(Chrome)其实可以下载离线包,用离线包安装的好处,就是一次获得全部安装文件,不需要漫长的在线下载过程了! 下载地址:https://www.google.com/chrome/eula ...

  6. Spring框架中<mvc:default-servlet-handler/>的作用

    优雅REST风格的资源URL不希望带 .html 或 .do 等后缀.由于早期的Spring MVC不能很好地处理静态资源,所以在web.xml中配置DispatcherServlet的请求映射,往往 ...

  7. C# 封装返回类

    using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using System. ...

  8. redis基础学习

    redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了java ...

  9. Ubuntu Linux 查看、编辑、比较二进制文件

    查看二进制有以下几种方法: 方法一:hexdump apt-get install libdata-hexdumper-perl 安装好之后就可以直接hexdump your_binary_file ...

  10. 基于Chromium的浏览器已上线通用“显示密码”按钮

    基于Chromium的Edge在日前发布的Canary通道版本中,对用户界面进行了优化调整从而让InPrivate窗口变得更加简洁.在今天获得的版本更新中,微软继续带来了隐私相关的新内容--实现通用的 ...