最小花费---------------------图论(dijkstra)/转换成最短路

在 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(目标)=(起始)xw1w2w3wn
那么如果想让x最小,只能让w1
w2w3…*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]);
}
发布了412 篇原创文章 · 获赞 8 · 访问量 8879

猜你喜欢

转载自blog.csdn.net/qq_43690454/article/details/104279535