poj 2240:Arbitrage

解題思路:

(1)floyd算法

(2)更新矩陣時利用項之間的乘積

#include<iostream>
#include<cstring>
using namespace std;

string currency[40];
float exchange[40][40];
int n,m,c=0;

void floyd()
{
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				exchange[i][j] = max(exchange[i][j],exchange[i][k] * exchange[k][j]);
	for(int i=1;i<=n;i++)
		if(exchange[i][i] > 1)
		{
			cout<<"Case "<<c<<": Yes"<<endl;
			return;
		}
	cout<<"Case "<<c<<": No"<<endl;
	return;
}

int main()
{
	while(cin>>n)
	{
		memset(exchange,0,sizeof(exchange));
		for(int i=1;i<=n;i++)
			exchange[i][i] = 1;
		c++;
		if(n == 0)
			break;
		for(int i=1;i<=n;i++)
			cin>>currency[i];
			
		string a,b;
		int p,q;
		double c;
		
		cin>>m;
		while(m--)
		{
			cin>>a>>c>>b;
			for(int i=1;i<=n;i++)
			{
				if(a == currency[i])
					p = i;
				if(b == currency[i])
					q = i;
			}
			exchange[p][q] = c;
		}
		floyd();
	}
	return 0;
} 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章