题目大意
有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费
是0.39,那么你可以得到(100 - 0.39) * 29.75 = 2963.3975 B币。问s币的金额经过交换最终得到的s币金额数能否增加
货币的交换是可以重复多次的,所以我们需要找出是否存在正权回路,且最后得到的s金额是增加的
有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费
是0.39,那么你可以得到(100 - 0.39) * 29.75 = 2963.3975 B币。问s币的金额经过交换最终得到的s币金额数能否增加
货币的交换是可以重复多次的,所以我们需要找出是否存在正权回路,且最后得到的s金额是增加的
怎么找正权回路呢?(正权回路:在这一回路上,顶点的权值能不断增加即能一直进行松弛)
/***********************************************
* Author: fisty
* Created Time: 2015/2/13 20:13:52
* File Name : four_5.cpp
*********************************************** */
/*题目大意
有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费
是0.39,那么你可以得到(100 - 0.39) * 29.75 = 2963.3975 B币。问s币的金额经过交换最终得到的s币金额数能否增加
货币的交换是可以重复多次的,所以我们需要找出是否存在正权回路,且最后得到的s金额是增加的
怎么找正权回路呢?(正权回路:在这一回路上,顶点的权值能不断增加即能一直进行松弛)
*/
#include <iostream>
#include <cstring>
#include <deque>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <algorithm>
using namespace std;
#define Debug(x) cout << #x << " " << x <<endl
#define Memset(x, a) memset(x, a, sizeof(x))
const int INF = 0x3f3f3f3f;
typedef long long LL;
typedef pair<int, int> P;
#define FOR(i, a, b) for(int i = a;i < b; i++)
#define MAX_N 200
#define EPS 1e-9
int n, m, s;
double v;
struct node{
int u;
int v;
double cost;
double rate;
}G[2*MAX_N];
bool Bellman_Ford(){
bool lable;
double d[MAX_N];
FOR(i, 0, n+1) d[i] = 0.0;
d[s] = v;
while(d[s] <= v +EPS){
lable = true;
FOR(i, 0, m){
double tmp = (d[G[i].u] - G[i].cost) * G[i].rate;
if(d[G[i].v] + EPS < tmp){
d[G[i].v] = tmp;
lable = false;
}
}
//不能继续松弛的话判断是否金钱大于初始值
if(lable) return (d[s] - v) > 0;
}
return true;
}
int main() {
//freopen("in.cpp", "r", stdin);
cin.tie(0);
ios::sync_with_stdio(false);
while(cin >> n >> m >> s >>v){
int A, B;
double Rab,Cab, Rba, Cba;
FOR(i, 0, m){
cin >> A >> B >> Rab >> Cab >> Rba >> Cba;
//A->B
G[i].u = A; G[i].v = B;
G[i].rate = Rab; G[i].cost = Cab;
//B->A
G[i+m].u = B; G[i+m].v = A;
G[i+m].rate = Rba; G[i+m].cost = Cba;
}
m = m * 2;
if(Bellman_Ford()){
cout << "YES" << endl;
}else{
cout << "NO" << endl;
}
}
return 0;
}