P1576 最小花费
题目背景
题目描述
在n个人中,某些人的银行账号之间可以互相转账。这些人之间转账的手续费各不相同。给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元。
输入输出格式
输入格式:
第一行输入两个正整数n,m,分别表示总人数和可以互相转账的人的对数。
以下m行每行输入三个正整数x,y,z,表示标号为x的人和标号为y的人之间互相转账需要扣除z%的手续费 (z<100)。
最后一行输入两个正整数A,B。数据保证A与B之间可以直接或间接地转账。
输出格式:
输出A使得B到账100元最少需要的总费用。精确到小数点后8位。
输入输出样例
- 3 3
- 1 2 1
- 2 3 2
- 1 3 3
- 1 3
- 103.07153164
说明
1<=n<=2000
思路:一开始乖乖的打了个Dijkstra记录路径然后慢慢求最后才发现好扯淡也就能过个样例
正确做法是求出每个边的权重然后直接暴力
注意因为有除法的存在所以大于号小于号可能和平常的Dijkstra相反
0分代码
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- using namespace std;
- int map[][];
- double money=;
- int dis[];
- int maxn=0x7fffff;
- int pass[];
- int vis[];
- int n,m;
- int ans[];
- void print(int bg,int ed)
- {
- int now=;
- ans[now]=ed;
- now++;
- int tmp=pass[bg];
- while(tmp!=ed&&tmp!=)
- {
- ans[now]=tmp;
- now++;
- tmp=pass[tmp];
- }
- ans[now]=bg;
- int qq=ed;
- for(int i=;i<=now;i++)
- {
- money=money/((double)(-map[ans[i-]][ans[i]])/);
- }
- printf("%.8lf",money);
- }
- void Dijkstra(int p)
- {
- memset(dis,0x7f,sizeof(dis));
- vis[p]=;
- for(int i=;i<=n;i++)
- {
- dis[i]=map[p][i];
- }
- for(int i=;i<=n;i++)
- {
- int minn=maxn;
- int k;
- for(int j=;j<=n;j++)
- {
- if(vis[j]==&&dis[j]<minn)
- {
- minn=dis[j];
- k=j;
- }
- }
- vis[k]=;
- for(int j=;j<=n;j++)
- {
- if(dis[j]>dis[k]+map[k][j])
- {
- dis[j]=dis[k]+map[k][j];
- pass[j]=k;
- }
- }
- }
- }
- int main()
- {
- memset(map,0x7f,sizeof(map));
- scanf("%d%d",&n,&m);
- for(int i=;i<=n;i++)
- {
- int x,y,z;
- scanf("%d%d%d",&x,&y,&z);
- map[x][y]=z;
- map[y][x]=z;
- }
- int a,b;
- scanf("%d%d",&a,&b);
- Dijkstra(b);
- print(b,a);
- return ;
- }
AC代码
- #include<iostream>
- #define MAXN 2001
- #define inf 99999
- using namespace std;
- int N,M,A,B;
- double m[MAXN][MAXN];
- int main()
- {
- int i,j;
- cin>>N>>M;
- cout.setf(ios::fixed);
- for (i=;i<N;i++)
- for (j=;j<N;j++)
- m[i][j]=/inf;
- for (i=;i<M;i++)
- {
- int x,y,t;
- cin>>x>>y>>t;
- x--; y--;
- m[x][y]=m[y][x]=-(t/100.0); //exchange to weight
- }
- cin>>A>>B;
- A--; B--;
- //dijkstra
- double dis[MAXN]; //dis i:money needed to trans 100 to i
- bool book[MAXN];
- book[B]=true;
- for (i=;i<N;i++)
- {
- dis[i]=/m[B][i]; //init dis[]
- book[i]=false; //init book[]
- }
- for (j=;j<N;j++)
- {
- int nmin;
- double min=inf;
- for (i=;i<N;i++)
- if (dis[i]<min&&!book[i])
- {
- nmin=i;
- min=dis[nmin]; //find #min->nmin
- }
- book[nmin]=true; //record in book[]
- for (i=;i<N;i++)
- if (min/m[nmin][i]<dis[i]&&!book[i]) //relax
- dis[i]=min/m[nmin][i];
- }
- cout.precision();
- cout<<dis[A];
- return ;
- }
P1576 最小花费的更多相关文章
- 洛谷—— P1576 最小花费
P1576 最小花费 题目背景 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使 ...
- Luogu P1576 最小花费
题目背景 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元 ...
- 洛谷P1576||最小花费||dijkstra||双向建边!!
题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元. 数据范 ...
- 洛谷 P1576 最小花费
题目戳 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元. ...
- 洛谷P1576 最小花费x
题目背景 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元 ...
- P1576 最小花费 洛谷
https://www.luogu.org/problem/show?pid=1576 题目背景 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间 ...
- 浅谈SPFA——洛谷P1576 最小花费 题解
想找原题请点击这里:传送门 原题: 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少 ...
- 把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend
//把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend //dp[i][j]:把第i个数转成第j小的数,最小花费 //此题与po ...
- 把一个序列转换成非严格递增序列的最小花费 POJ 3666
//把一个序列转换成非严格递增序列的最小花费 POJ 3666 //dp[i][j]:把第i个数转成第j小的数,最小花费 #include <iostream> #include < ...
随机推荐
- ReentranLock实现原理
原文链接:https://blog.csdn.net/jeffleo/article/details/56677425 一.ReentranLock 相信我们都使用过ReentranLock,Reen ...
- react 中文文档案例三 (开关按钮)
开关按钮制作 import React from 'react'; import ReactDOM from 'react-dom'; class Toggle extends React.Com ...
- 实施MySQL ReplicationDriver支持读写分离
MySQL 提供支持读写分离的驱动类: com.mysql.jdbc.ReplicationDriver 替代 com.mysql.jdbc.Driver 注意,所有参数主从统一: jdbc:mysq ...
- python 根据 数据库创建java 文件
#coding=utf-8 import pymysql import os import re # 包全路径 packagepath=r'E:\idea工程\dc-exam\dc-exam\src\ ...
- HTML5拖拽——将本地文件拖拽到网页中显示
HTML5标准中的提供的用于文件输入输出(I/O)的对象 File: 代表一个文件对象 FileList: 代表一个文件列表,类数组对象 FileReader 用于从文件中提取内容 FileWrite ...
- stringstream的用法
stringstream的基本用法 stringstream是字符串流.它将流与存储在内存中的string对象绑定起来. 在多种数据类型之间实现自动格式化. 1.stringstream对象的使用 # ...
- WIN2008R2 asp.net core的配置
配置IIS Windows Server上通过“添加角色和功能”,桌面Windows上通过“启用和关闭Windows功能”来安装和配置IIS.确保勾选Web服务和“IIS 管理控制台”: Window ...
- Photoshop入门教程(五):滤镜
学习心得:滤镜通常用于摄影行业,是安装在相机镜头前用于过滤自然光的附加镜头,从而获得一些特殊的效果.同理,Photoshop的滤镜也是为了产生特殊的效果.Photoshop滤镜分为两类:一种是内部滤镜 ...
- 21-----BBS论坛
BBS论坛(二十一) 21.1.编辑轮播图功能完成 (1)cms_banners.html 把属性绑定到<tr>上面,方便找到各属性的值 <tbody> {% for bann ...
- Jupyter 环境配置
1. 找到python文件目录, 用管理员身份打开powershell python -m pip install jupyter 2. Jupyter notebook