本来是一道非常简单的题,但是我wa了这么多
首先我得说一下POJ了,不支持 #include<bits/stdc++.h>
用#define要加 #include<stdlib.h> 的头文件又长见识了。
然后就是我自己的原因的,我在代码里面详细说明吧
思路
从例子中我们呢可以判断出,这是一道判断环的问题,这个专题之前也写过一道类似的题目,30的数据量,那就直接floyd吧
代码
Powered by CK
#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<algorithm>
#include<string>
#include<map>
#include<cstring>
#define esp 1e-8
using namespace std;
const int N = 110;
double ans[N][N];
int n, m;
map<string, int> mp;//这里存的是对应的货币的数字,每种货币对应一个数字。
void init() {//多组输入初始化很重要
memset(ans, 0, sizeof ans);
mp.clear();
}
bool Floyed() {
for(int i = 1; i <= n; i++) ans[i][i] = max(ans[i][i], 1.0);//第二个坑,如果输入的时候可能会出现同种货币的交换,而且汇率大于1
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(ans[i][j] < ans[i][k] * ans[k][j])
ans[i][j] = ans[i][k] * ans[k][j];
}
if(ans[i][i] > 1.0) return true;
}
return false;
}
int main() {
ios::sync_with_stdio(false);
string x, y;
double w;
int cas = 1;
while(cin >> n && n) {
init();
for(int i = 1; i <= n; i++) {
cin >> x;
mp[x] = i;
}
cin >> m;
for(int i = 0; i < m; i++) {
cin >> x >> w >> y;
ans[mp[x]][mp[y]] = max(w, ans[mp[x]][mp[y]]);//第一个坑,邻阶矩阵存图,判断最优边权很重要。
}
if(Floyed())cout << "Case " << cas++ << ": Yes" <<endl;
else cout << "Case " << cas++ << ": No" << endl;
}
return 0;
}