现在的位置: 首页 > 综合 > 正文

POJ 2240 Arbitrage

2014年02月14日 ⁄ 综合 ⁄ 共 2532字 ⁄ 字号 评论关闭
Arbitrage
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 11585   Accepted: 4864

Description

Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currency. For example, suppose that 1 US Dollar buys 0.5 British pound, 1 British pound buys
10.0 French francs, and 1 French franc buys 0.21 US dollar. Then, by converting currencies, a clever trader can start with 1 US dollar and buy 0.5 * 10.0 * 0.21 = 1.05 US dollars, making a profit of 5 percent.

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

The input will contain one or more test cases. Om the first line of each test case there is an integer n (1<=n<=30), representing the number of different currencies. The next n lines each contain the name of one currency. Within
a name no spaces will appear. The next line contains one integer m, representing the length of the table to follow. The last m lines each contain the name ci of a source currency, a real number rij which represents the exchange rate from ci to cj and a name
cj of the destination currency. Exchanges which do not appear in the table are impossible.

Test cases are separated from each other by a blank line. Input is terminated by a value of zero (0) for n.

Output

For each test case, print one line telling whether arbitrage is possible or not in the format "Case case: Yes" respectively "Case case: No".

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

解题思路:水阿水,水完一道少一道啊,Floyd的变型而已,map[i][j]=max{map[i][j],map[i][k]*map[k][j]},求出任意两种货币间的最大相对汇率,这样若A,B间汇率为a,而B,A间汇率为b,若a*b>1.0(此处用double型,不是1)证明这两种货币间兑换有利可图,输出Yes,若图中不存在符合上述条件的两种货币,则输出No;比较坑爹的就是同种货币间可以有大于1的汇率供自己兑换自己,开始没考虑到,WA了一次。
#include<iostream>
using namespace std;
double map[35][35];
int n,e;
void Floyd()
{
	int i,j,k;
	for(k=1;k<=n;k++)
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				if(map[i][j]<map[i][k]*map[k][j])
					map[i][j]=map[i][k]*map[k][j];
}
int main()
{
	int i,j,k,p,q,Case=1;
	double rate;
	bool flag;
	char money[35][30];
	char a[30],b[30];
	while(cin>>n&&n)
	{
		flag=false;
		memset(map,1,sizeof(map));
		for(i=1;i<=n;i++)
			cin>>money[i];
		    cin>>e;
		for(j=1;j<=e;j++)
		{
			cin>>a>>rate>>b;
			for(k=1;k<=n;k++)
				{//p.q记下货币下标,为用邻接矩阵构图做准备
					if(strcmp(money[k],a)==0)
					    p=k;
					if(strcmp(money[k],b)==0)
						q=k;
			     }
			map[p][q]=rate;
		}
		Floyd();
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
			{
					if(map[i][j]*map[j][i]>1.0)
						{
							flag=true;
							break;
					    }
					if(flag)
						break;
			}
			if(flag)
				cout<<"Case "<<Case<<": Yes\n";
			else
				cout<<"Case "<<Case<<": No\n";
			Case++;
	}
	return 0;
}

抱歉!评论已关闭.