大意:通过货币的兑换去套利,若能套利则输出Yes,否则输出No。
思路:通过Floyd算法算出的d[i][i]即每种货币能不能套利,只要存在一种则输出Yes。数据的处理通过STL中的map容器去处理。
CODE:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
using namespace std;
const int SIZE = 34;
double d[SIZE][SIZE];
map<string, int> hash; //map容器
int n, m;
int cnt, flag;
void Floyd()
{
int i, j, k;
for(k = 1; k <= n; k++)
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
d[i][j] >?= d[i][k] * d[k][j];
double max = -1;
for(i = 1; i <= n; i++) max >?= d[i][i];
if(max > 1) puts("Yes");
else puts("No");
}
void init()
{
memset(d, 0, sizeof(d));
hash.clear();
cnt = flag = 0;
}
int main()
{
int times = 0;
char str[SIZE];
while(~scanf("%d", &n), n)
{
init();
for(int i = 1; i <= n; i++) //用while(n--)会影响后面的结果。
{
scanf("%s", str);
if(!hash[str]) hash[str] = ++cnt; //map的数据处理
}
scanf("%d", &m);
for(int i = 1; i <= m; i++)
{
double cost;
char sz1[SIZE], sz2[SIZE];
scanf("%s%lf%s", sz1, &cost, sz2);
int x = hash[sz1];
int y = hash[sz2];
d[x][y] = cost;
if(x == y && cost > 1) flag = 1;
}
printf("Case %d: ", ++times);
if(flag) printf("Yes\n");
else
{
Floyd();
}
}
return 0;
}
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
using namespace std;
const int SIZE = 34;
double d[SIZE][SIZE];
map<string, int> hash; //map容器
int n, m;
int cnt, flag;
void Floyd()
{
int i, j, k;
for(k = 1; k <= n; k++)
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
d[i][j] >?= d[i][k] * d[k][j];
double max = -1;
for(i = 1; i <= n; i++) max >?= d[i][i];
if(max > 1) puts("Yes");
else puts("No");
}
void init()
{
memset(d, 0, sizeof(d));
hash.clear();
cnt = flag = 0;
}
int main()
{
int times = 0;
char str[SIZE];
while(~scanf("%d", &n), n)
{
init();
for(int i = 1; i <= n; i++) //用while(n--)会影响后面的结果。
{
scanf("%s", str);
if(!hash[str]) hash[str] = ++cnt; //map的数据处理
}
scanf("%d", &m);
for(int i = 1; i <= m; i++)
{
double cost;
char sz1[SIZE], sz2[SIZE];
scanf("%s%lf%s", sz1, &cost, sz2);
int x = hash[sz1];
int y = hash[sz2];
d[x][y] = cost;
if(x == y && cost > 1) flag = 1;
}
printf("Case %d: ", ++times);
if(flag) printf("Yes\n");
else
{
Floyd();
}
}
return 0;
}