题意:
Nick现在有一国的货币,他想看能不能通过与其他货币交换使得自己的财富增加(存在正环)。
国与国之间的货币交换遵循下面的规则:currB=(currA-commAB)*rateAB;
思路:
最短路找环,确定使用Bellman-Ford算法,利用松弛的的次数确定图中是否存在正环。
代码实现:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX = 110;
const int INF = 1050;
struct Edge{
int from;
int to;
double rate;
double comm;
};
int cnt;
int N,S,M;
double V;
bool flag;
double curr[MAX];
Edge edge[2*MAX];
bool find_loop();
int main()
{
while( scanf("%d",&N) != EOF ){
scanf("%d%d",&M,&S);
scanf("%lf",&V);
for( int i = 1; i < N; i++ ){
curr[i] = 0;
}
curr[S] = V;
cnt = 0;
flag = false;
int a,b;
double c,d,e,f;
for( int i = 0; i < M; i++ ){
scanf("%d%d",&a,&b);
scanf("%lf%lf%lf%lf",&c,&d,&e,&f);
edge[cnt].from = a;
edge[cnt].to = b;
edge[cnt].rate = c;
edge[cnt].comm = d;
cnt++;
edge[cnt].from = b;
edge[cnt].to = a;
edge[cnt].rate = e;
edge[cnt].comm = f;
cnt++;
}
flag = find_loop();
if( flag == true ){
printf("YES\n");
}
else{
printf("NO\n");
}
}
return 0;
}
bool find_loop(){
for( int i = 0; i < N; i++ ){
for( int j = 0; j < cnt; j++ ){
Edge e = edge[j];
if( curr[e.to] < (curr[e.from]-e.comm)*e.rate ){
curr[e.to] = (curr[e.from]-e.comm)*e.rate;
if( i == N-1 ){
return true;
}
}
}
}
return false;
}