题目大意:
有n种货币,其中m对货币之间可以以一定的汇率兑换,问你存不存在经过几种货币的两两兑换之后能够挣到钱。
解题思路:
其实就是寻找一条路径从原点出发再回早原点,使得原点的值变大。这也是不能使用Dijkstra的原因了。我使用的是floyd,挺容易理解的,因为非常的粗暴。
#include<stdio.h>
#include<string.h>
#include<map>
#include<string>
#define N 33
using namespace std;
double Map[N][N];
void initi(int n){
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(i==j)
Map[i][j]=1;
else
Map[i][j]=0;
}
}
void floyd(int n){
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()
{
map<string,int> mp;
int n,i,m;
char s[100],s1[100];
double dis;
bool mark;
int cas=1;
while(scanf("%d",&n)&&n){
initi(n);
for(i=1;i<=n;i++){
scanf("%s",s);
mp[s]=i;
}
scanf("%d",&m);
while(m--){
scanf("%s%lf%s",s,&dis,s1);
Map[mp[s]][mp[s1]]=dis;
}
floyd(n);
mark=false;
for(i=1;i<=n;i++)
if(Map[i][i]>1){
mark=true;
break;
}
if(mark)
printf("Case %d: Yes\n",cas++);
else
printf("Case %d: No\n",cas++);
}
}