变相的使用bellman。
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
double INF=1e9;
int s,n,m;
double v;
#define NUM 105
struct Exchage{
int to;
double r;
double c;
void data(int _to,double _r,double _c){
to=_to;
r=_r;
c=_c;
}
}exchage;
vector<Exchage> ex[NUM];
queue<int> q;
double d[NUM];
void init(){
for(int i=0;i<NUM;i++){
d[i]=INF;
}
}
int main(){
scanf("%d %d %d %lf",&n,&m,&s,&v);
for(int i=0;i<m;i++){
int A,B;
double RAB,CAB,RBA,CBA;
scanf("%d %d %lf %lf %lf %lf",&A,&B,&RAB,&CAB,&RBA,&CBA);
exchage.data(B,RAB,CAB);
ex[A].push_back(exchage);
exchage.data(A,RBA,CBA);
ex[B].push_back(exchage);
}
init();
d[s]=-v;
q.push(s);
while(!q.empty()){
int from=q.front();
q.pop();
for(int j=0;j<ex[from].size();j++){
double nv=(d[from]+ex[from][j].c)*ex[from][j].r;
if(d[ex[from][j].to]>nv){
d[ex[from][j].to]=nv;
q.push(ex[from][j].to);
}
}
if(d[s]<-v){
cout<<"YES"<<endl;
return 0;
}
}
cout<<"NO"<<endl;
return 0;
}
本文介绍了一种变相使用Bellman-Ford算法的方法,用于解决带费用的货币兑换问题。通过构建图模型,利用双精度浮点数进行精确计算,判断是否存在负权回路,进而确定是否有可能无限获利。
436

被折叠的 条评论
为什么被折叠?



