-
时间:2016-04-13 23:48:46 星期三
-
题目编号:[2016-04-13][POJ][1860][Currency Exchange]
-
题目大意:货币对换,问最后能否通过对换的方式使钱变多,
-
分析:
- 直接spfa判断是否存在环,如果存在那么就能无限增值
- 如果不存在正环,那么直接判断最终d[s] 是否 大于初始值
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 100 + 10;
struct Edge{
int v;double c, r;
Edge(int _v = 0,double _c = 0,double _r = 0):v(_v),c(_c),r(_r){}
};
vector<Edge> e[maxn];
void ini(int n ){
for(int i = 0 ; i <= n ; ++i){
e[i].clear();
}
}
void addedge(int u,int v,double c,double r){
e[u].push_back(Edge(v,c,r));
}
int cnt[maxn];double d[maxn];
bool spfa(int s,int n,double v){
for(int i = 0 ; i <= n ; ++i) d[i] = 0;
d[s] = v;
queue<int> q;q.push(s);
memset(cnt, 0 , sizeof(cnt));
cnt[s] = 1;
while(!q.empty()){
int u = q.front();
q.pop();
for(int i = 0 ; i < e[u].size();++i){
int v = e[u][i].v;
if(d[v] < (d[u] - e[u][i].c) * e[u][i].r){
d[v] = (d[u] - e[u][i].c) * e[u][i].r;
q.push(v);
if(++cnt[v] > n) return true;
}
}
}
return d[s] > v;
}
int main(){
int n,m,s;
double v;
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);
addedge(a,b,Cab,Rab);
addedge(b,a,Cba,Rba);
}
puts(spfa(s,n,v)?"YES":"NO");
return 0;
}
时间: 2024-12-05 19:51:17