| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 11886 | Accepted: 5000 |
Description
Your job is to write a program that takes a list of currency exchange rates as input and then determines whether arbitrage is possible or not.
Input
Test cases are separated from each other by a blank line. Input is terminated by a value of zero (0) for n.
Output
Sample Input
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
Sample Output
Case 1: Yes Case 2: No
Source
思路:只要是经过许多边能让其值大于1,就说明可以套汇,因此可以使用类似于最短路的算法,求最大汇率,bellman-ford.每次往大的松弛的。
#include<iostream>
#include<cstring>
using namespace std;
const int mm=990;
const double oo=1e9;
class node
{
public:int u,v;double c;
}edge[mm];
char s[33][110],a[mm],b[mm];
double dis[mm];
int n,m,pos;
bool bell_man(int v)
{
memset(dis,0,sizeof(dis));
dis[v]=1;
for(int i=0;i<n;i++)
for(int j=0;j<pos;j++)
if(dis[edge[j].v]<dis[edge[j].u]*edge[j].c)
dis[edge[j].v]=dis[edge[j].u]*edge[j].c;
if(dis[v]>1.0)return 1;
else return 0;
}
int main()
{ int cas=0;
while(cin>>n&&n)
{ pos=0;++cas;
for(int i=0;i<n;i++)
cin>>s[i];
cin>>m;double d;
for(int i=0;i<m;i++)
{
cin>>a>>d>>b;
int j=-1;
while(strcmp(s[++j],a)!=0);edge[pos].u=j;j=-1;
while(strcmp(s[++j],b)!=0);edge[pos].v=j;
edge[pos++].c=d;
}
bool flag=0;
for(int i=0;i<n;i++)
if(bell_man(i))
{flag=1;break;}
cout<<"Case "<<cas<<": ";
if(flag)cout<<"Yes\n";
else cout<<"No\n";
}
}
4776



被折叠的 条评论
为什么被折叠?



