3 USDollar BritishPound FrenchFranc 3 USDollar 0.5 BritishPound BritishPound 10.0 FrenchFranc FrenchFranc 0.21 USDollar 3 USDollar BritishPound FrenchFranc 6 USDollar 0.5 BritishPound USDollar 4.9 FrenchFranc BritishPound 10.0 FrenchFranc BritishPound 1.99 USDollar FrenchFranc 0.09 BritishPound FrenchFranc 0.19 USDollar 0
Case 1: Yes Case 2: No
方法1:
一种货币经过兑换其它的货币,经过几轮兑换,最终回到该货币,使其价值变大,这就是“套利”。采用bellman_ford算法,不是求对短路,求最大获利,在bellman算法上改动。判断是否含有正权回路。
代码:
#include <iostream> #include <string.h> using namespace std; const int maxn=35; double dis[maxn]; string str[maxn]; int nodeNum,edgeNum; struct Edge { int s,e; double w; }edge[maxn*maxn]; bool bellman_ford(int start) { for(int i=1;i<=nodeNum;i++) dis[i]=0;//改动1 dis[start]=1; bool ok; for(int i=1;i<=nodeNum-1;i++) { ok=0; for(int j=1;j<=edgeNum;j++) { if(dis[edge[j].s]*edge[j].w>dis[edge[j].e])//改动2 { dis[edge[j].e]=dis[edge[j].s]*edge[j].w; ok=1; } } if(!ok) break; } for(int i=1;i<=edgeNum;i++) if(dis[edge[i].s]*edge[i].w>dis[edge[i].e]) return true; return false; } int main() { int c=1; while(cin>>nodeNum&&nodeNum) { for(int i=1;i<=nodeNum;i++) cin>>str[i]; cin>>edgeNum; string from,to; double w; for(int i=1;i<=edgeNum;i++) { cin>>from>>w>>to; int j,k; for(j=1;j<=nodeNum;j++) if(from==str[j]) break; for(k=1;k<=nodeNum;k++) if(to==str[k]) break; edge[i].s=j; edge[i].e=k; edge[i].w=w; } if(bellman_ford(1)) cout<<"Case "<<c++<<": Yes"<<endl; else cout<<"Case "<<c++<<": No"<<endl; } return 0; }方法二:
建立图,邻接矩阵,求任意两条边之间的最短路,如果dis[i][i]>1 的话,说明存在正权回路。代码中使用到了map, 字符串到整型编号的映射
代码:
#include <iostream> #include <map> #include <string.h> using namespace std; const int maxn=40; string str[maxn]; double mp[maxn][maxn]; int nodeNum,edgeNum; void floyed() { for(int k=1;k<=nodeNum;k++) for(int i=1;i<=nodeNum;i++) for(int j=1;j<=nodeNum;j++) { if(mp[i][j]<mp[i][k]*mp[k][j]) mp[i][j]=mp[i][k]*mp[k][j]; } } int main() { int c=1; while(cin>>nodeNum&&nodeNum) { map<string,int>st; for(int i=1;i<=nodeNum;i++) { cin>>str[i]; st[str[i]]=i; } for(int i=1;i<=nodeNum;i++) for(int j=1;j<=nodeNum;j++) { if(i==j) mp[i][j]=1; else mp[i][j]=0; } cin>>edgeNum; string from,to;double w; for(int i=1;i<=edgeNum;i++) { cin>>from>>w>>to; mp[st[from]][st[to]]=w; } floyed(); bool ok=0; for(int i=1;i<=nodeNum;i++) if(mp[i][i]>1) ok=1; if(ok) cout<<"Case "<<c++<<": Yes"<<endl; else cout<<"Case "<<c++<<": No"<<endl; } return 0; }
[ACM] hdu 1217 Arbitrage (bellman_ford最短路,判断是否有正权回路或Floyed),布布扣,bubuko.com
[ACM] hdu 1217 Arbitrage (bellman_ford最短路,判断是否有正权回路或Floyed)
原文地址:http://blog.csdn.net/sr_19930829/article/details/37818973