Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 18152 | Accepted: 7676 |
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
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int n,m,s,flag,vis[33][33];
double rt,ch[33][33],ans;
char ss[110],a[110],b[110];
map<string,int> ma;
void dfs(int aa)
{
double ans1;
for(int i=0;i<n;i++) {
if(ch[aa][i]&&vis[aa][i]==0) {
vis[aa][i]=1;
ans1=ans;
ans*=ch[aa][i];
if(i==s&&ans>1) {
flag=1;return ;
}
dfs(i);
if(flag)
return ;
ans=ans1;
vis[aa][i]=0;
}
}
}
int main()
{
int k=1;
while(~scanf("%d",&n)&&n) {
for(int i=0;i<n;i++) { 把货币名称映射为数字,便于使用邻接矩阵。
scanf("%s",ss);
ma[ss]=i;
}
scanf("%d",&m);
for(int i=0;i<m;i++) {
scanf("%s%lf%s",a,&rt,b);
ch[ma[a]][ma[b]]=rt;
}
flag=0;
memset(vis,0,sizeof(vis));
for(s=0;s<n;s++) {
ans=1.0;
dfs(s);
}
if(flag==1) {
printf("Case %d: Yes\n",k++);
}
else
printf("Case %d: No\n",k++);
}
return 0;
}
想法2:问题的实质相当于求有环最长路径,用floyd处理是不错的选择。
结果:AC。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int n,m,k=1;
double ch[33][33];
int main()
{
double rt;
map<string,int> ma;
char ss[110],a[110],b[110];
while(~scanf("%d",&n)&&n) {
memset(ch,0,sizeof(ch));
for(int i=0;i<n;i++) {
scanf("%s",&ss);
ch[i][i]=1;
ma[ss]=i;
}
scanf("%d",&m);
for(int i=0;i<m;i++) {
scanf("%s%lf%s",a,&rt,b);
ch[ma[a]][ma[b]]=rt;
}
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
for(int k=0;k<n;k++) {
if(ch[i][j]<ch[i][k]*ch[k][j]) {
ch[i][j]=ch[i][k]*ch[k][j];
}
}
}
}
int flag=0;
for(int i=0;i<n;i++) {
if(ch[i][i]>1) {
flag=1;
break;
}
}
if(flag)
printf("Case %d: Yes\n",k++);
else
printf("Case %d: No\n",k++);
}
return 0;
}