问题:通过汇率是否能够套利。
解法:bellmanford可以求正负环,操作后看是否存在正环。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
int N,M;
map<string,int> V;
typedef struct edge
{
int from,to;
double rate;
edge(){};
edge(int f,int t,double r):from(f),to(t),rate(r){};
}edge;
edge es[1000];
double d[35];
int BellmanFord(int s,double v){
memset(d,0,sizeof(d));
d[s]=v;
int update=1;
for (int i = 0; i < N; ++i)
{
update=0;
for (int i = 0; i < M; ++i)
{
edge e=es[i];
if (d[e.from]!=0&&d[e.to]<d[e.from]*e.rate)
{
update=1;
d[e.to]=d[e.from]*e.rate;
}
}
if (!update)
{
break;
}
}
for (int i = 0; i < M; ++i)
{
edge e=es[i];
if (d[e.to]<d[e.from]*e.rate)
{
return 1;
}
}
return 0;
}
int main(int argc, char const *argv[])
{
int cases=1;
while(scanf("%d",&N)&&N!=0){
string ss,s;
double rate;
V.clear();
for (int i = 0; i < N; ++i)
{
cin>>ss;
V[ss]=i;
}
scanf("%d",&M);
for (int i = 0; i < M; ++i)
{
cin>>ss>>rate>>s;
int f=V[ss];
int t=V[s];
edge e(f,t,rate);
es[i]=e;
}
if(BellmanFord(0,1.0)){
printf("Case %d: Yes\n",cases);
}else{
printf("Case %d: No\n",cases);
}
cases++;
}
return 0;
}