题意:给你一些钱和货币兑换点,问能不能换经过一系列交换,使得钱增值。
思路:如果图中跟起点连接有正权环,那么就输出“YES”,否则,输出“NO”。
#include<iostream>
#include<cstdio>
#include <vector>
#include<queue>
#define pb push_back
using namespace std;
const int maxn = 105,inf = 1e9+10;
struct node {
int to;
double R,c;
};
vector<node>G[maxn];
int inq[maxn],cnt[maxn];
double d[maxn];
int n,m,S;
double V;
int ford(int n)
{
queue<int>q;
d[S] = V,inq[S] = 1;
q.push(S);
while(!q.empty())
{
int u = q.front();
q.pop();
inq[u] = 0;
for(int i=0;i<G[u].size();i++)
{
int v = G[u][i].to;
double c = G[u][i].c;
double R = G[u][i].R;
double dis = (d[u] - c)*R;
if(d[v] < dis)
{
d[v] = dis;
if(!inq[v])
{
inq[v] = 1;
q.push(v);
if(++cnt[v] > n)return 1;
}
}
}
}
return 0;
}
int main()
{
scanf("%d%d%d%lf",&n,&m,&S,&V);
for(int i=1;i<=m;i++)
{
int u,v;
double Ra,ca,Rb,cb;
cin>>u>>v>>Ra>>ca>>Rb>>cb;
node tmp;
tmp.to = v;
tmp.R = Ra;
tmp.c = ca;
G[u].pb(tmp);
tmp.to = u;
tmp.R = Rb;
tmp.c = cb;
G[v].pb(tmp);
}
if(ford(n)==1)puts("YES");
else puts("NO");
return 0;
}