【Arbitrage】【POJ - 2240 】(folyd)

题目链接:http://poj.org/problem?id=2240

想想就美滋滋的一道题, 今天训练的时候,作为dijkstra堆优化和spfa掌握的不大好的我,居然用folyd A了两道,果然,数据范围小,暴力过一切,美滋滋

解题思路:就是问你货币转换一圈之后,看看是否可以增值,有的同学使用spfa做的,进行判断是否存在环,在判断是否增长,不得不承认,这是比较正规的做法,因为数据再大一些,就会超时的。

不过这个题目,还是可以的,直接计算最大路径,最后判断是否dis[0][0]是否大于1.因为是浮点数,所以判断的时候需要做差和eps进行判断。就酱。

ac代码:

#include<cstdio>
#include<algorithm>
#include<map>
#include<cstring>
#include<iostream>
#define maxn 50
#define eps 1e-8
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
double len[maxn][maxn];
bool mark[maxn];

void folyd()
{
	for(int k=0;k<n;k++)
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
			{
				if(len[i][j]<len[i][k]*len[k][j])
					len[i][j]=len[i][k]*len[k][j];
			}
}
int main()
{	
	int count=0;
	map<string,int>lu;
	int flag;
	char str[30]; 
	char a[30],b[30];
	double c;
	while(scanf("%d",&n)!=EOF&&n)
	{
		memset(len,inf,sizeof(len));
		for(int i=0;i<n;i++)
			len[i][i]=1;
		lu.clear();
		for(int i=0;i<n;i++)
		{
			scanf("%s",str);
			if(!lu[str]) lu[str]=i;
		}
		scanf("%d",&m);
		for(int i=0;i<m;i++)
		{
			scanf("%s%lf%s",a,&c,b);
			len[lu[a]][lu[b]]=c;
		}
		folyd();
		printf("Case %d: ",++count);
		if(len[0][0]-1.0>eps) printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42505741/article/details/81414419