题目链接: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;
}