题意:给出N种货币,M种兑换方式,现在手上有X的货币总价值为VAL。接下来有M行,每行开始两个数字表示两种可以相互兑换的货币A,B,然后是A兑换成B的比率,手续费,B兑换成A的比率,手续费。问是否可以兑换增加手中的VAL。
Bellman_ford。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N=105; double dis[N]; struct node { int x,y; double rate,com; void fun(int a,int b,double c,double d){x=a;y=b;rate=c;com=d;} }edge[N*2]; int main() { int n,m,x,all=0; double val; scanf("%d%d%d%lf",&n,&m,&x,&val); for(int i=0;i<m;i++) { int a,b; double r1,r2,t1,t2; scanf("%d%d%lf%lf%lf%lf",&a,&b,&r1,&r2,&t1,&t2); edge[all++].fun(a,b,r1,r2); edge[all++].fun(b,a,t1,t2); } dis[x]=val; while(dis[x]<=val) { bool flag=0; for(int j=0;j<all;j++) { int x=edge[j].x,y=edge[j].y; double com=edge[j].com,rate=edge[j].rate; if(dis[y]<(dis[x]-com)*rate) { flag=1; dis[y]=(dis[x]-com)*rate; } } if(!flag) break; } if(dis[x]>val) puts("YES"); else puts("NO"); return 0; }