很久以前看见的题目没做,因为是英文不想看,今天还是做了:
题意:一个城市里有很多货币兑换点,每个兑换点可以兑换不同的货币,比如说a兑换b有一个兑换率r,还有一个手续费c,那么有价值v的a货币兑换成b货币就有(a-c)*r。现在输入n,m,s,v;表示有n种货币,m个兑换点,刚开始拥有的货币种类编号为s,价值为v。每个兑换点输入a,b,Rab,Cab,Rba,Cba,这个兑换点用a兑换b和b兑换a的兑换率和手续费。相当于无向边。
题意懂了就相当于构图判断有没有正权环,用Bellman不过相当于求最长路。
代码:
#include<iostream>
using namespace std;
#define exp 1e-6
struct node
{
double c,r;
int a,b;
} e[250];
int n,k;
double dist[105];
bool Bellman_Ford(int s,double v)
{
int i;
bool flag;
for( i=0; i<n; i++)
dist[i]=0;
dist[s]=v;
while( dist[s]<v+exp){
flag=false;
for( i=0; i<k; i++){
double temp=(dist[e[i].a]-e[i].c)*e[i].r;
if( dist[e[i].b]<temp){
dist[e[i].b]=temp;
flag=true;
}
}
if( !flag)
return false;
}
return true;
}
int main()
{
int n,m,s,i,a,b;
double v;
while( scanf("%d%d%d%lf",&n,&m,&s,&v)!=EOF){
k=2*m;
for( i=0; i<k; i++){
scanf("%d%d",&a,&b);
e[i].a=a;
e[i].b=b;
scanf("%lf%lf",&e[i].r,&e[i].c);
i++;
e[i].a=b;
e[i].b=a;
scanf("%lf%lf",&e[i].r,&e[i].c);
}
if( Bellman_Ford(s,v))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}