题目大意:有多种货币,他们之间可以相互兑换,a,b,两种货币之间,c为手续费,r为汇率,本金为s,a-b的权值就是(V-Cab)*Rab 问能否通过交换最终得到多余s的货币。
分析:货币之间的交换可以通过不同的货币分别进行交换,我们要找出是否存在正权回路,也就是说 我们需要找一条回路使顶点上的权值能够不断地增加(一直能进行松弛)
本题是求最大路径,不过我们只需要判断有无无限松弛的环即可,这和Bellman的思路一致。
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,s,m,cnt=1;
double v,d[110];
struct lxt//本人姓名缩写而已。。不用深究
{
int a,b;
double r,c;
}exc[202];
bool Bellman()
{
memset(d,0,sizeof(d));
d[s]=v;
bool flag=false;
for(int i=2;i<=n;i++)
{
flag=false;
for(int j=1;j<=cnt;j++)
if(d[exc[j].b]<(d[exc[j].a]-exc[j].c) *exc[j].r)
{
d[exc[j].b]=((d[exc[j].a]-exc[j].c)*exc[j].r);
flag=true;
}
if(!flag )
break;//不能继续松弛
}
for(int k=1;k<=cnt;k++)
{
if(d[exc[k].b] < ((d[exc[k].a] - exc[k].c) * exc[k].r))
return true;
}
return false;
}
int main()
{
int a,b;
double x,y,z,k;
while(cin>>n>>m>>s>>v)
{
cnt=1;
memset(exc,0,sizeof(exc));
double x,y,z,k;
for(int i=1;i<=m;i++)
{
cin>>a>>b>>x>>y>>z>>k;
exc[cnt].a=a;
exc[cnt].b=b;
exc[cnt].r=x;
exc[cnt++].c=y;
exc[cnt].a=b;
exc[cnt].b=a;
exc[cnt].r=z;
exc[cnt++].c=k;
}
if(Bellman())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
// while(1);
return 0;
}