链接:http://poj.org/problem?id=1860
题意:货币兑换,然后看最后本金能否升值。
浅谈:惭愧啊。 先不说这个题,先说说我现在的想法。我觉得按以前的学习经验一般都是,有一个新的知识点,理解之后,然后会有一两个经典例题去做,去掌握这个知识点,然后再去做其它的题目。而现在算法学习是:学一个算法,学习了它的思想,代码,然后直接找题目往上套。问题是,这些题目都不是那种死板的例题,有些好活,规规矩矩的算法还没用过,就得变相使用这个算法。根本就不行啊,很吃力。
所以有些题目根本出不来。要怎么解决这个问题呢?还是要再想想,把它搞好。然后再说说这个题。惭愧的说这个又是看解题报告的。这题要用Bellman—Ford算法,关键是要反向使用。尼玛,根本没玩过。不过,总之是反着来,我就不多说了。因为不是自己想的。我的代码基本也是照着别人写的。好了,不多说了。贴代码。
#include<iostream>
#define mMAX 205
#define nMAX 105
using namespace std;
struct exchange
{
{
int a,b;
double rate,com;
};
exchange ex[mMAX];
double dist[nMAX];
int S,p,cur_num;
double money;
bool BellmanFord(int v)
{
int i,k;
bool flag;
memset(dist,0,sizeof(dist));
dist[v]=money;
for(k=1;k<cur_num;k++)
{
flag=true;
for(i=0;i<=p;i++)
{
if(dist[ex[i].b]<(dist[ex[i].a]-ex[i].com)*ex[i].rate)
{
dist[ex[i].b]=(dist[ex[i].a]-ex[i].com)*ex[i].rate;
flag=false;
}
}
if(flag)break;
}
for(i=0;i<=p;i++)
if(dist[ex[i].b]<(dist[ex[i].a]-ex[i].com)*ex[i].rate)
return true;
return false;
}
int main()
{
int n,m,s;
int A,B;
double Cab,Cba,Rab,Rba;
int i;
double v;
while(cin>>n>>m>>s>>v)
{
S=s;
money=v;
cur_num=n;
p=0;
for(i=1;i<=m;i++)
{
cin>>A>>B;
cin>>Rab>>Cab;
cin>>Rba>>Cba;
ex[p].a=A;
ex[p].b=B;
ex[p].rate=Rab;
ex[p++].com=Cab;
ex[p].a=B;
ex[p].b=A;
ex[p].rate=Rba;
ex[p++].com=Cba;
}
if(BellmanFord(S))
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}