题目链接:点击打开链接
题目大意:货币之间的交易是按照两种货币的汇率进行,并且交易的时候需要支付一定的待交换货币作为手续费。问是否有办法使得最开始的钱有所增长。
判断是否有负环。可以用spfa。如果有元素进队列次数超过n,说明存在负环。
//#include <bits/stdc++.h>
#include <iostream>
#include <string.h>
#include <cstdio>
#include <vector>
using namespace std;
#define N 1005
typedef struct {
int v;
double rate,com;
}node;
vector<node>p[105];
bool vis[105];
double dis[105];
int q[N];
int times[105];
bool deal(int s,double mo,int n){
int f,r;
bool flag = false;
f = r = 0;
r = 1;
vis[s] = 1;
q[0] = s;
times[s]++;
int u,v;
dis[s] = mo;
while(f!=r){
u = q[f++];
vis[u] = false;
f%=N;
for(int i = 0;i<p[u].size();i++){
v = p[u][i].v;
if(dis[v] < (dis[u]-p[u][i].com)*p[u][i].rate){
dis[v] = (dis[u]-p[u][i].com)*p[u][i].rate;
if(!vis[v]){
vis[v] = true;
times[v]++;
q[r++] = v;
r%=N;
}
}
}
if(times[u] > n) {flag = true; break;}
}
return flag;
}
int main()
{
memset(times,0,sizeof(times));
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
node tmp;
int n,m,s,u,v;
double l,ra,rb,ca,cb;
cin>>n>>m>>s>>l;
for(int i = 0;i < m; i++)
{
cin>>u>>v>>ra>>ca>>rb>>cb;
tmp.v = v;
tmp.rate = ra;
tmp.com = ca;
p[u].push_back(tmp);
tmp.v = u;
tmp.rate = rb;
tmp.com = cb;
p[v].push_back(tmp);
}
bool flag;
flag = deal(s,l,n);
if(flag) printf("YES\n");
else printf("NO\n");
return 0;
}