I - Arbitrage
Posted jaydenouyang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了I - Arbitrage相关的知识,希望对你有一定的参考价值。
1 //SPFA 2 #include <iostream> 3 #include <algorithm> 4 #include <string> 5 #include <map> 6 #include <cstring> 7 #include <vector> 8 #include <queue> 9 using namespace std; 10 11 const int maxn = 50; 12 const double Start = 100; 13 14 struct node{ 15 int val; 16 double len; 17 node(int _val, double _len){ 18 val = _val; 19 len = _len; 20 }; 21 }; 22 23 map<string ,int>mp; 24 vector<node>g[maxn]; 25 double d[maxn]; 26 bool vis[maxn]; 27 28 #define INF 0xffffff 29 30 void init(int n, int x){ 31 for(int i = 0;i <= n;i++){ 32 d[i] = -INF; 33 vis[i] = true; 34 } 35 d[x] = Start; 36 } 37 38 queue<int>q; 39 bool SPFA(int s){ 40 while(!q.empty()) 41 q.pop(); 42 q.push(s); 43 vis[s] = false; 44 while(!q.empty()){ 45 int x = q.front();q.pop(); 46 int xl = g[x].size(); 47 for(int i = 0 ;i < xl; i++){ 48 node y = g[x][i]; 49 /* 50 if(vis[y.val] == false){ 51 continue; 52 } 53 vis[y.val] = true; 54 */ 55 double k = d[x]*y.len; 56 if(k > d[y.val]){ 57 d[y.val] = k; 58 q.push(y.val); 59 } 60 } 61 if(d[s] > Start){ 62 return true; 63 } 64 } 65 return false; 66 } 67 68 int main(){ 69 int n; 70 int cnt = 0; 71 while(cin >> n){ 72 mp.clear(); 73 for(int i =0 ;i < maxn;i++){ 74 g[i].clear(); 75 } 76 cnt++; 77 if(n == 0) 78 break; 79 string s; 80 for(int i = 1;i <= n;i++){ 81 cin >> s; 82 mp[s] = i; 83 } 84 int m; 85 cin >> m; 86 string s1, s2; 87 double d; 88 for(int i = 0;i < m;i++){ 89 cin >> s1 >> d >> s2; 90 int u = mp[s1]; 91 int v = mp[s2]; 92 g[u].push_back(node(v,d)); 93 } 94 95 bool ok = false; 96 for(int i = 1;i <= n;i++){ 97 init(n, i); 98 if(SPFA(i)){ 99 ok = true; 100 break; 101 } 102 } 103 cout << "Case " << cnt << ": "; 104 if(ok){ 105 cout << "Yes" << endl; 106 } 107 else{ 108 cout << "No" << endl; 109 } 110 } 111 return 0; 112 }
以上是关于I - Arbitrage的主要内容,如果未能解决你的问题,请参考以下文章