Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 17170 | Accepted: 7248 |
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
floyd:暴力每次遍历所有字符串,后面有更新的
#include <cstdio> #include <cstring> #define MAX 40 using namespace std; double map[MAX][MAX]; char str[MAX][MAX]; char a[MAX], b[MAX]; int n, m; int p = 1; void getmap() { int i, j; int x, y; double rate; memset(map, 0, sizeof(map)); for(i = 0; i < n; i++) { scanf("%s", str[i]); for(j = 0; j < n; j++) { map[i][j] = 1; } } scanf("%d", &m); for(i = 0;i < m; i++) { scanf("%s%lf%s", a, &rate, b); x = y = -1; for(j = 0;j < n; j++) { if(strcmp(a, str[j]) == 0) x = j; if(strcmp(b, str[j]) == 0) y = j; if(x != -1 && y != -1) break; } map[x][y] = rate; } } void floyd() { int k, i, j; for(k = 0; k < n ;k++) { for(i = 0; i < n; i++) { for(j = 0; j < n; j++) { if(map[i][j] < map[i][k] * map[k][j]) map[i][j] = map[i][k] * map[k][j]; } } } } void slove() { int i; int exist = 0; printf("Case %d: ", p++); for(i = 0; i < n; i++) { if(map[i][i] > 1) { exist = 1; break; } } if(exist) printf("Yes\n"); else printf("No\n"); } int main() { while(scanf("%d", &n), n) { getmap(); floyd(); slove(); } return 0; }
每次都遍历很多字符串,这样很麻烦,我们可以建立map<string, int>cur的一个映射,来记录字符串的出现顺序。
更新时间:2015.6.23
#include <cstdio> #include <cstring> #include <map> #include <string> #define MAX 40 using namespace std; double Map[MAX][MAX]; char str[MAX]; char a[MAX], b[MAX]; int n, m; int p = 1; map<string, int> cur; void getMap() { int i, j; double rate; for(i = 1; i <= n; i++) { scanf("%s", str); for(j = 1; j <= n; j++) { Map[i][j] = 1; } } scanf("%d", &m); int num = 1; cur.clear(); while(m--) { scanf("%s%lf%s", a, &rate, b); if(!cur[a]) cur[a] = num++; if(!cur[b]) cur[b] = num++; Map[cur[a]][cur[b]] = rate; } } void floyd() { int k, i, j; for(k = 1; k <= n ;k++) { for(i = 1; i <= n; i++) { for(j = 1; j <= n; j++) { if(Map[i][j] < Map[i][k] * Map[k][j]) Map[i][j] = Map[i][k] * Map[k][j]; } } } } void slove() { int i; int exist = 0; printf("Case %d: ", p++); for(i = 1; i <= n; i++) { if(Map[i][i] > 1) { exist = 1; break; } } if(exist) printf("Yes\n"); else printf("No\n"); } int main() { while(scanf("%d", &n), n) { getMap(); floyd(); slove(); } return 0; }