题目:
链接:点击打开链接
题意:
给出几种货币和各货币之间的兑换率,如果1钱货币通过多次兑换后大于1,就输出yes,不然输出no。
思路:
Floyd算法(求出两个点之间的最短路)的公式简单变形+map的简单应用。
代码:
#include <iostream>
#include <cstdio>
#include <map>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 40
int n,m;
double dis[N][N];
int floyd()
{
for(int k=1; k<=n; k++)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(dis[i][j] < dis[i][k] * dis[k][j])
dis[i][j] = dis[i][k]*dis[k][j];
}
}
}
for(int i=1; i<=n; i++)
{
if(dis[i][i] > 1)
{
return true;
}
}
return false;
}
int main()
{
//freopen("input.txt","r",stdin);
int kase = 1;
char currency[N],a[N],b[N];
double trans;
map<string,int> p;
while(scanf("%d",&n) != EOF && n)
{
p.clear();
memset(dis,0,sizeof(dis));
for(int i=1; i<=n; i++)
{
scanf("%s",currency);
p[currency] = i;
}
scanf("%d",&m);
for(int i=1; i<=m; i++)
{
scanf("%s %lf %s",a,&trans,b);
dis[p[a]][p[b]] = trans;
}
printf("Case %d: %s\n",kase++,floyd() == 1 ? "Yes" : "No");
}
return 0;
}
----------------------------------------------------------------------------------
战斗,从不退缩;奋斗,永不停歇~~~~~~~~~~~~~~~~~~~~