HDU 1217 Arbitrage (初学Floyed)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1217
题意:转化成图,然后求是否存在某回路,其权值的积大于1
Floyed是求任意两点间的最短路径的,用了动态规划,思想和松弛一样,其中有个k,是指最短路径的中间点都在集合1....k里,然后k从小到大推,当k最大的时候就得到结果。。。。松弛思想在g[i][k]*g[k][j]
和g[i][j]中选择。。。
而这题则是求最大,且是乘积。。。所以要改下。。。。但是转化成图哪里就不用多说了,但是我才发现map A<string, int> 中的string 可以用char str[...]来代替,即可以A[str] = 6,其中str是char型而不是string
代码:
#include <iostream> #include <string> #include <map> using namespace std; const int M = 50; double g[M][M]; int Floyed(int n) { for (int k = 1; k <= n; k++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (g[i][j] < g[i][k] * g[k][j]) { g[i][j] = g[i][k] * g[k][j]; } } } } for (int i = 1; i <= n; i++) { if (g[i][i] > 1) { return 1; } } return 0; } int main() { int n; int t = 0; while (~scanf("%d", &n), n) { map <string, int> A; for (int i = 1; i <= n; i++) { string str; cin >> str; A[str] = i; } int m; scanf("%d", &m); memset(g, 0, sizeof(g)); while (m--) { string a, b; double c; cin >> a >> c >> b; if (g[A[a]][A[b]] < c) { g[A[a]][A[b]] = c; } } printf("Case %d: ", ++t); if (Floyed(n)) { puts("Yes"); } else { puts("No"); } } return 0; }
posted on 2012-08-14 20:53 [S*I]SImMon_WCG______* 阅读(344) 评论(0) 编辑 收藏 举报