input:money.in output:money.out

时间限制: 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
103.07153164

数据范围限制

对于所有数据, 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]);
}