LOL新英雄皮肤弹丸天使点击就送

 

两种做法:

1.边的权值为手续费z,从b向a跑最短路,边跑边处理答案

2.边的权值为汇率,从a向b跑最短路,边跑边处理答案

 

#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
queue<double>q;
double path[100010],n,m,z,dis[100010],vis[100010];
int x,y,A,B,k;
struct node{
    int u,v,nxt;
    double w;
}edge[200010];
void add(int xx,int yy,double zz)
{
    edge[++k].u =xx;
    edge[k].v =yy;
    edge[k].w =1-zz/100;
    edge[k].nxt =path[xx];
    path[xx]=k;
}
int main()
{
    scanf("%lf%lf",&n,&m);
    for(int i=1;i<=m;++i)
    {
        scanf("%d%d%lf",&x,&y,&z);
        add(y,x,z);add(x,y,z);
    }
    scanf("%d%d",&A,&B);
    for(int i=0;i<=n;++i)
        dis[i]=0x3fff;
    dis[B]=100;vis[B]=1;
    q.push(B);
    while(!q.empty())
    {
        int now=q.front() ;
        q.pop() ;
        vis[now]=0;
        
        for(int i=path[now];i;i=edge[i].nxt )
        {
            if(dis[edge[i].v]>dis[edge[i].u]/edge[i].w)
            {
                dis[edge[i].v]=dis[edge[i].u]/edge[i].w;
                if(!vis[edge[i].v])
                {
                    q.push(edge[i].v );
                    vis[edge[i].v]=1;
                }
            }
        }
    }
    printf("%.8lf",dis[A]);
    return 0;
} 
做法1

相关文章: