时间限制: 1000 ms 空间限制: 262144 KB
题目描述
在n个人中,某些人的银行账号之间可以互相转账。这些人之间转账的手续费各不相同。给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元。
输入
第一行输入两个用空格隔开的正整数n和m,分别表示总人数和可以互相转账的人的对数。以下m行每行输入三个用空格隔开的正整数x; y; z,表示标号为x的人和标号为y的人之间互相转账需要扣除z%的手续费(z < 100)。最后一行输入两个用空格隔开的正整数A和B。数据保证A与B之间可以直接或间接地转账。
输出
输出A使得B到账100元最少需要的总费用。精确到小数点后8位。
样例输入
1 2 3 4 5
| 3 3 1 2 1 2 3 2 1 3 3 1 3
|
样例输出
数据范围限制
对于所有数据, 1 <= n <=2000。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| #include<bits/stdc++.h> int queue[10001]; double dis[10001],tab[10001]; double a[2100][2100]; using namespace std; int main() { freopen("money.in","r",stdin); freopen("money.out","w",stdout); int n,m,A,b,head=0,tail=1; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); a[x][y]=a[y][x]=(100-z)*1.0/100; } scanf("%d%d",&A,&b); dis[A]=1; tab[A]=1; queue[1]=A; while(head<=tail) { head++; tab[queue[head]]=0; int curx=queue[head]; for(int i=1;i<=n;i++){ if(a[curx][i]!=0){ if(dis[i]<dis[curx]*a[curx][i]){ dis[i]=dis[curx]*a[curx][i]; if(tab[i]==0){ queue[++tail]=i; tab[i]=1; } } } } } printf("%.8lf",100/dis[b]); }
|
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 暗影小站! 注: 本博客暂不开设评论区,请使用邮件119548583@qq.com联系