Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 13067 | Accepted: 5493 |
Descriptionios
Input算法
Outputapp
Sample Inputspa
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 Outputcode
Case 1: Yes Case 2: No
Sourceorm
/******************************************************* 題意:判斷是否存在使得匯率增多的環 【任意一個點的匯率增多均可以】 算法:bellman_ford 判斷正環 注意:這裏的鬆弛操做要循環 N 次才能過, 書上的鬆弛操做一直都是 N-1 次 對於爲何是 N 或者 N-1 次一直沒有理解清楚 ********************************************************/ #include<stdio.h> #include<string.h> #include<string> #include<map> #include<algorithm> #include<iostream> using namespace std; const int maxn = 40; double d[maxn]; int n,m; struct Edge{ int u,v; double r; }edge[maxn*maxn]; map<string, int> mp; bool bellman_ford(int s) { memset(d,0,sizeof(d)); d[s] = 1; for(int i = 1; i <= n; i++) { for(int j = 0; j < m; j++) { int u = edge[j].u; int v = edge[j].v; double r = edge[j].r; if(d[v] < d[u]*r) d[v] = d[u]*r; } } if(d[s] > 1.0) return true; else return false; } int main() { int kcase = 0; while(scanf("%d", &n) != EOF) { if(n == 0) break; mp.clear(); string s; for(int i = 1; i <= n; i++) { cin>>s; mp[s] = i; } scanf("%d", &m); string s1,s2; double rat; for(int i = 0; i < m; i++) { cin>>s1>>rat>>s2; edge[i].u = mp[s1]; edge[i].v = mp[s2]; edge[i].r = rat; } bool flag = false; for(int i = 1; i <= n; i++) { if(bellman_ford(i)) { flag = true; break; } } printf("Case %d: ", ++kcase); if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }
/******************************************************* 題意:判斷是否存在使得匯率增多的環 【任意一個點的匯率增多均可以】 算法:floyd 簡單變形 w[i][j] = max(w[i][j], w[i][k]*w[k][j]) ********************************************************/ #include<stdio.h> #include<string.h> #include<string> #include<map> #include<algorithm> #include<iostream> using namespace std; const int maxn = 40; double d[maxn]; int n,m; double w[maxn][maxn]; map<string, int> mp; void floyd() { for(int k = 1; k <= n; k++) for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) w[i][j] = max(w[i][j], w[i][k]*w[k][j]); } int main() { int kcase = 0; while(scanf("%d", &n) != EOF) { if(n == 0) break; mp.clear(); string s; for(int i = 1; i <= n; i++) { cin>>s; mp[s] = i; w[i][i] = 1; //本身到本身的匯率爲 1, 注意這個初始化必須寫在下面建圖前面。。。 } scanf("%d", &m); string s1,s2; double rat; for(int i = 0; i < m; i++) { cin>>s1>>rat>>s2; w[mp[s1]][mp[s2]] = rat; } floyd(); int flag = 0; for(int i = 1; i <= n; i++) { if(w[i][i] > 1.0) { flag = 1; break; } } printf("Case %d: ", ++kcase); if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }