两种做法:
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; }