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