在 n 个人中,某些人的银行账号之间可以互相转账。
这些人之间转账的手续费各不相同。
给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问 A 最少需要多少钱使得转账后 B 收到 100 元。
输入格式
第一行输入两个正整数 n,m,分别表示总人数和可以互相转账的人的对数。
以下 m 行每行输入三个正整数 x,y,z,表示标号为 x 的人和标号为 y 的人之间互相转账需要扣除 z 的手续费 ( z<100 )。
最后一行输入两个正整数 A,B。
数据保证 A 与 B 之间可以直接或间接地转账。
输出格式
输出 A 使得 B 到账 100 元最少需要的总费用。
精确到小数点后 8 位。
数据范围
1≤n≤2000,
m≤105
输入样例:
3 3
1 2 1
2 3 2
1 3 3
1 3
输出样例:
103.07153164
解析:
根据公式:100(目标)=(起始)xw1w2w3…wn
那么如果想让x最小,只能让w1w2w3…*wn最大
根据给的关系我们建一个图,求图中最大路,权重不在是和,而是积
扫描二维码关注公众号,回复:
9220219 查看本文章
#include<bits/stdc++.h>
using namespace std;
int n,m,sx,sy;
double dist[3000];
double g[3000][3000];
int a,b,c;
bool st[100005];
void dijkstra()
{
dist[sx]=1;//赋值成最大值
for(int i=0;i<n-1;i++)
{
int t=-1;
for(int j=1;j<=n;j++)
{
if(!st[j]&&(t==-1||dist[t]<dist[j])) t=j;
}
st[t]=true;
for(int j=1;j<=n;j++) dist[j]=max(dist[j],dist[t]*g[t][j]);
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++)
{
cin>>a>>b>>c;
double z=(100.0-c)/100;
g[a][b]=g[b][a]=max(g[a][b],z);
}
cin>>sx>>sy;
dijkstra();
printf("%.8lf\n",100/dist[sy]);
}