标签:
Description:
Input:
Output:
Sample Input:
3 USDollar BritishPound FrenchFranc 3 USDollar 0.5 BritishPound BritishPound 10.0 FrenchFranc FrenchFranc 0.21 USDollar 3 USDollar BritishPound FrenchFranc 6 USDollar 0.5 BritishPound USDollar 4.9 FrenchFranc BritishPound 10.0 FrenchFranc BritishPound 1.99 USDollar FrenchFranc 0.09 BritishPound FrenchFranc 0.19 USDollar 0
Sample Output:
Case 1: Yes Case 2: No
题意:知道货币的名字和每两种货币兑换的利率,那么现在要判断当每种货币经过一系列兑换之后再次回到该种货币时价值是否增加。(和POJ 1860 Currency Exchange一样,只是要找到货币名称所对应的下标)
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; const int N=50; const int INF=0x3f3f3f3f; struct node { char s[110]; }no[N]; double G[N][N], dist[N]; int vis[N], cou[N], n; void Init() { int i, j; for (i = 1; i <= n; i++) { dist[i] = -INF; vis[i] = cou[i] = 0; for (j = 1; j <= n; j++) G[i][j] = -INF; G[i][i] = 0; } } int Judge(char a[]) ///找到字符串a的下标 { int i; for (i = 1; i <= n; i++) { if (strcmp(a, no[i].s) == 0) return i; } return -1; } int Spfa() { int i, v; queue<int>Q; Q.push(1); dist[1] = 1; while (!Q.empty()) { v = Q.front(); Q.pop(); for (i = 1; i <= n; i++) { if (dist[i] < dist[v]*G[v][i]) { dist[i] = dist[v]*G[v][i]; if (!vis[i]) { Q.push(i); vis[i] = 1; cou[i]++; if (cou[i] >= n) ///有回路代表货币价值增加,因为只有货币兑换后价值增加才会进行这一步 return 1; } } } vis[v] = 0; } return 0; } int main () { int i, j, m, ans, k = 0; char a[110], b[110]; double d; while (scanf("%d", &n), n) { Init(); k++; for (i = 1; i <= n; i++) scanf("%s", no[i].s); scanf("%d", &m); while (m--) { scanf("%s %lf %s", a, &d, b); i = Judge(a); j = Judge(b); G[i][j] = d; } ans = Spfa(); if (ans) printf("Case %d: Yes\n", k); else printf("Case %d: No\n", k); } return 0; }
标签:
原文地址:http://www.cnblogs.com/syhandll/p/4813703.html