最小花费(dijkstra)

\1126. 最小花费

在 n个人中,某些人的银行账号之间可以互相转账。

这些人之间转账的手续费各不相同。

给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问 A 最少需要多少钱使得转账后 BB收到 100 元。

输入格式

第一行输入两个正整数 n,m分别表示总人数和可以互相转账的人的对数。

以下 mm 行每行输入三个正整数 x,y,z,表示标号为 xx的人和标号为 y 的人之间互相转账需要扣除 z 的手续费 ( z<100 )。

最后一行输入两个正整数 A,BA,B。

数据保证 AA 与 BB 之间可以直接或间接地转账。

输出格式

输出 A 使得 B 到账 100 元最少需要的总费用。

精确到小数点后 8 位。

数据范围

1≤n≤2000,
m≤105

输入样例:

3 3
1 2 1
2 3 2
1 3 3
1 3

输出样例:

103.07153164

就是找一条路,让这条路上的所有权值的乘积最大;

记为,应该有

注意到有:

因此,如果把所有的路的权值取对数的话,就相当于求一条边权和最大的路了......

这个地方有 : ,因此有,那么这幅图的所有的边都是负权的,要求最长路,就相当于把所有的路都加上负号然后求最短路

想想看,dijkstra算法要怎么写呢

//伪代码也算不上的 伪の代码
int v = p.second;
for(int i = 0; i < G[v].size(); i++){
    edge e = G[v][i];
    if(log(d[e.to]) > log(d[e.from]) - log(e.cost) ){
        log(d[e.to]) = log(d[e.from]) - log(e.cost);
        que.push(P(d[e,to],e.to));
    }
}

直接把log符号脱掉:

for (int i = 0; i < G[v].size(); i++){
    edge e = G[v][i];
    if(d[e.to]

其实也可以不囿于这种"最短路"的思考方式,直接想如何魔改dijkstra算法,现在要求乘积最大的一条路,自然松弛操作要想到:

for (int i = 0; i < G[v].size(); i++){
    edge e = G[v][i];
    if(d[e.to]

然后再考虑堆优化,如果我从没用过的点里面选择 目前乘积最大的一个点,既然没有比他小的点,那么就没有点可以更新他,也就是说,d值最大的点的乘积已经被确定了.因此是可以进行堆优化的,但是每次从堆顶选择的应该是最小的元素.

#include
#include
#include
#include
#include
#include

const int MAX_V = 2000 + 7;
const int INF = 100000000;
double d[MAX_V];//最大乘积

using namespace std;

struct edge{
    int from, to;
    double cost;
};

typedef pair P;//first是最短距离,second是顶点编号

int V,E;
vector G[MAX_V];//邻接矩阵

void dijkstra(int s){
    priority_queue> que;
    d[s] = 1;
    que.push(P(1, s));

    while(!que.empty()){
        P p = que.top();
        que.pop();//出队
        int v = p.second;
        
        if(p.first>V>>E;
    
    while(E--){
        edge e;
        int temp;
        scanf("%d%d%d",&e.from,&e.to,&temp);
        e.cost=(double)temp;
        e.cost=1-(e.cost/100.0);
        G[e.from].push_back(e);
        swap(e.from,e.to);
        G[e.from].push_back(e);
    }
    
    int a,b;
    cin>>a>>b;
    dijkstra(a);
    double ans = 100/d[b];
    printf("%.8lf",ans);
    return 0;
    
}


你可能感兴趣的:(最小花费(dijkstra))