题目链接。
题意:
根据汇率可以将一种金币换成其他的金币,求最后能否赚到比原来更多的金币。
分析:
最短路的求法,用floyd.
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <queue> #include <algorithm> #include <cmath> #include <string> #include <map> using namespace std; const int maxn = 100; map<string, int> a; double G[maxn][maxn]; int cn ; int main() { int n, m, u, v, cnt = 0; char s[1000], s1[1000], s2[1000]; double rate; while(cin >> n) { if(n == 0) break; a.clear(); cn = 0; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { G[i][j] = 1.0; } } for(int i=0; i<n; i++) { scanf("%s", s); if(a.count(s) == 0) a[s] = cn++; } cin >> m; for(int i=0; i<m; i++) { cin >> s1 >> rate >> s2; if(a.count(s1) == 1) u = a[s1]; else continue; if(a.count(s2) == 1) v = a[s2]; else continue; G[u][v] = rate; } for(int k=0; k<n; k++) { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { G[i][j] = max(G[i][j], G[i][k]*G[k][j]); } } } bool flag = false; for(int i=0; i<n; i++) { if(G[i][i] > 1.0) { flag = true; break; } } if(flag) printf("Case %d: Yes ", ++cnt); else printf("Case %d: No ", ++cnt); } return 0; }