poj1860 Currency Exchange

来源:互联网 发布:佛山广电网络营业厅 编辑:程序博客网 时间:2024/05/18 00:50

链接:http://poj.org/problem?id=1860
 题意:货币兑换,然后看最后本金能否升值。
浅谈:惭愧啊。 先不说这个题,先说说我现在的想法。我觉得按以前的学习经验一般都是,有一个新的知识点,理解之后,然后会有一两个经典例题去做,去掌握这个知识点,然后再去做其它的题目。而现在算法学习是:学一个算法,学习了它的思想,代码,然后直接找题目往上套。问题是,这些题目都不是那种死板的例题,有些好活,规规矩矩的算法还没用过,就得变相使用这个算法。根本就不行啊,很吃力。
所以有些题目根本出不来。要怎么解决这个问题呢?还是要再想想,把它搞好。然后再说说这个题。惭愧的说这个又是看解题报告的。这题要用Bellman—Ford算法,关键是要反向使用。尼玛,根本没玩过。不过,总之是反着来,我就不多说了。因为不是自己想的。我的代码基本也是照着别人写的。好了,不多说了。贴代码。

#include<iostream>#define mMAX 205#define nMAX 105using 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;}