题目背景

题目描述

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

输入输出格式

输入格式:

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

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

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

输出格式:

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

输入输出样例

输入样例#1:

  1. 3 3
  2. 1 2 1
  3. 2 3 2
  4. 1 3 3
  5. 1 3
输出样例#1:

  1. 103.07153164

说明

1<=n<=2000

思路:一开始乖乖的打了个Dijkstra记录路径然后慢慢求最后才发现好扯淡也就能过个样例

   正确做法是求出每个边的权重然后直接暴力

   注意因为有除法的存在所以大于号小于号可能和平常的Dijkstra相反

0分代码

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. using namespace std;
  5. int map[][];
  6. double money=;
  7. int dis[];
  8. int maxn=0x7fffff;
  9. int pass[];
  10. int vis[];
  11. int n,m;
  12. int ans[];
  13. void print(int bg,int ed)
  14. {
  15.  
  16. int now=;
  17. ans[now]=ed;
  18. now++;
  19. int tmp=pass[bg];
  20. while(tmp!=ed&&tmp!=)
  21. {
  22. ans[now]=tmp;
  23. now++;
  24. tmp=pass[tmp];
  25. }
  26. ans[now]=bg;
  27. int qq=ed;
  28. for(int i=;i<=now;i++)
  29. {
  30. money=money/((double)(-map[ans[i-]][ans[i]])/);
  31. }
  32. printf("%.8lf",money);
  33. }
  34. void Dijkstra(int p)
  35. {
  36. memset(dis,0x7f,sizeof(dis));
  37. vis[p]=;
  38. for(int i=;i<=n;i++)
  39. {
  40. dis[i]=map[p][i];
  41. }
  42. for(int i=;i<=n;i++)
  43. {
  44. int minn=maxn;
  45. int k;
  46. for(int j=;j<=n;j++)
  47. {
  48. if(vis[j]==&&dis[j]<minn)
  49. {
  50. minn=dis[j];
  51. k=j;
  52. }
  53. }
  54. vis[k]=;
  55. for(int j=;j<=n;j++)
  56. {
  57. if(dis[j]>dis[k]+map[k][j])
  58. {
  59. dis[j]=dis[k]+map[k][j];
  60. pass[j]=k;
  61. }
  62. }
  63. }
  64. }
  65. int main()
  66. {
  67. memset(map,0x7f,sizeof(map));
  68. scanf("%d%d",&n,&m);
  69. for(int i=;i<=n;i++)
  70. {
  71. int x,y,z;
  72. scanf("%d%d%d",&x,&y,&z);
  73. map[x][y]=z;
  74. map[y][x]=z;
  75. }
  76. int a,b;
  77. scanf("%d%d",&a,&b);
  78. Dijkstra(b);
  79. print(b,a);
  80. return ;
  81. }

AC代码

  1. #include<iostream>
  2. #define MAXN 2001
  3. #define inf 99999
  4. using namespace std;
  5. int N,M,A,B;
  6. double m[MAXN][MAXN];
  7. int main()
  8. {
  9. int i,j;
  10. cin>>N>>M;
  11. cout.setf(ios::fixed);
  12. for (i=;i<N;i++)
  13. for (j=;j<N;j++)
  14. m[i][j]=/inf;
  15. for (i=;i<M;i++)
  16. {
  17. int x,y,t;
  18. cin>>x>>y>>t;
  19. x--; y--;
  20. m[x][y]=m[y][x]=-(t/100.0); //exchange to weight
  21. }
  22. cin>>A>>B;
  23. A--; B--;
  24. //dijkstra
  25. double dis[MAXN]; //dis i:money needed to trans 100 to i
  26. bool book[MAXN];
  27. book[B]=true;
  28. for (i=;i<N;i++)
  29. {
  30. dis[i]=/m[B][i]; //init dis[]
  31. book[i]=false; //init book[]
  32. }
  33. for (j=;j<N;j++)
  34. {
  35. int nmin;
  36. double min=inf;
  37. for (i=;i<N;i++)
  38. if (dis[i]<min&&!book[i])
  39. {
  40. nmin=i;
  41. min=dis[nmin]; //find #min->nmin
  42. }
  43. book[nmin]=true; //record in book[]
  44. for (i=;i<N;i++)
  45. if (min/m[nmin][i]<dis[i]&&!book[i]) //relax
  46. dis[i]=min/m[nmin][i];
  47. }
  48. cout.precision();
  49. cout<<dis[A];
  50. return ;
  51. }

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

  1. 洛谷—— P1576 最小花费

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

  2. Luogu P1576 最小花费

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

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

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

  4. 洛谷 P1576 最小花费

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

  5. 洛谷P1576 最小花费x

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

  6. P1576 最小花费 洛谷

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

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

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

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

    //把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend //dp[i][j]:把第i个数转成第j小的数,最小花费 //此题与po ...

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

    //把一个序列转换成非严格递增序列的最小花费 POJ 3666 //dp[i][j]:把第i个数转成第j小的数,最小花费 #include <iostream> #include < ...

随机推荐

  1. ReentranLock实现原理

    原文链接:https://blog.csdn.net/jeffleo/article/details/56677425 一.ReentranLock 相信我们都使用过ReentranLock,Reen ...

  2. react 中文文档案例三 (开关按钮)

    开关按钮制作   import React from 'react'; import ReactDOM from 'react-dom'; class Toggle extends React.Com ...

  3. 实施MySQL ReplicationDriver支持读写分离

    MySQL 提供支持读写分离的驱动类: com.mysql.jdbc.ReplicationDriver 替代 com.mysql.jdbc.Driver 注意,所有参数主从统一: jdbc:mysq ...

  4. python 根据 数据库创建java 文件

    #coding=utf-8 import pymysql import os import re # 包全路径 packagepath=r'E:\idea工程\dc-exam\dc-exam\src\ ...

  5. HTML5拖拽——将本地文件拖拽到网页中显示

    HTML5标准中的提供的用于文件输入输出(I/O)的对象 File: 代表一个文件对象 FileList: 代表一个文件列表,类数组对象 FileReader 用于从文件中提取内容 FileWrite ...

  6. stringstream的用法

    stringstream的基本用法 stringstream是字符串流.它将流与存储在内存中的string对象绑定起来. 在多种数据类型之间实现自动格式化. 1.stringstream对象的使用 # ...

  7. WIN2008R2 asp.net core的配置

    配置IIS Windows Server上通过“添加角色和功能”,桌面Windows上通过“启用和关闭Windows功能”来安装和配置IIS.确保勾选Web服务和“IIS 管理控制台”: Window ...

  8. Photoshop入门教程(五):滤镜

    学习心得:滤镜通常用于摄影行业,是安装在相机镜头前用于过滤自然光的附加镜头,从而获得一些特殊的效果.同理,Photoshop的滤镜也是为了产生特殊的效果.Photoshop滤镜分为两类:一种是内部滤镜 ...

  9. 21-----BBS论坛

    BBS论坛(二十一) 21.1.编辑轮播图功能完成 (1)cms_banners.html 把属性绑定到<tr>上面,方便找到各属性的值 <tbody> {% for bann ...

  10. Jupyter 环境配置

    1. 找到python文件目录, 用管理员身份打开powershell python -m pip install jupyter 2. Jupyter notebook