货币A可以兑换(A-c)*r的货币B。求货币S是否可以通过兑换,得到更多的货币S。货币种类<100
最长路判正环。
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
int V,E;
double d[110];
int inq[110];
int fre[110];
struct Edge{
int v;
double r;
double c;
};
vector<Edge> e[110];
void AddEdge(int u,int v,double r,double c){
e[u].push_back((Edge){v,r,c});
}
int spfa(int s,double m){
queue<int> q;
d[s]=m;
inq[s]=1;
fre[s]=1;
q.push(s);
while(!q.empty()){
int p=q.front();
q.pop();
inq[p]=0;
for(int i=0;i<e[p].size();++i){
if((d[p]-e[p][i].c)*e[p][i].r > d[e[p][i].v]){
d[e[p][i].v]=(d[p]-e[p][i].c)*e[p][i].r;
if(!inq[e[p][i].v]){
if(++fre[e[p][i].v]>=V)return 1;
q.push(e[p][i].v);
inq[e[p][i].v]=1;
}
}
}
}
return 0;
}
int main(){
int s;double m;
cin>>V>>E>>s>>m;
while(E--){
int u,v;
double r1,c1,r2,c2;
cin>>u>>v>>r1>>c1>>r2>>c2;
AddEdge(u,v,r1,c1);
AddEdge(v,u,r2,c2);
}
if(spfa(s,m))cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}