1. 程式人生 > >POJ 2240 Arbitrage

POJ 2240 Arbitrage

ios insert case cstring clu ring name tdi _for

題目大意:跟我上次做的那道感覺一模一樣,上次鏈接:https://www.cnblogs.com/ducklu/p/9231563.html

解題思路:Bellman_Ford判斷有無正環(對了,第一次RE了,數組要開大點,我開始只開了40)

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <map>
 5 #define INF 1000000
 6 #define MAXVERTEXNUM 1000
 7 using namespace std;
 8 
 9
int Nv, Ne, num; 10 struct Edge 11 { 12 int a, b; 13 double Weight; 14 }E[MAXVERTEXNUM]; 15 double dist[MAXVERTEXNUM]; 16 17 bool Bellman_ford() 18 { 19 for (int i = 1; i <= Nv; ++i) 20 { 21 bool flag = false; 22 for (int j = 0; j < num; ++j) 23 { 24 if
(dist[E[j].b] < dist[E[j].a] * E[j].Weight) 25 { 26 dist[E[j].b] = dist[E[j].a] * E[j].Weight; 27 flag = true; 28 } 29 } 30 if (!flag) 31 break; 32 } 33 34 for (int j = 0; j < num; ++j) 35 if (dist[E[j].b] < dist[E[j].a] * E[j].Weight)
36 return true; 37 38 return false; 39 } 40 41 int main() 42 { 43 // freopen("test.txt", "r", stdin); 44 int cas = 0; 45 while (true) 46 { 47 num = 0; 48 map<string, int> m; 49 memset(dist, 0, sizeof(dist)); 50 dist[1] = 1; 51 52 cin >> Nv; 53 if (!Nv) 54 return 0; 55 cas++; 56 57 for (int i = 1; i <= Nv; ++i) 58 { 59 string temp; 60 cin >> temp; 61 m.insert( {temp, i} ); 62 } 63 64 cin >> Ne; 65 66 for (int i = 1; i <= Ne; ++i) 67 { 68 string s1, s2; 69 double W; 70 cin >> s1 >> W >> s2; 71 72 E[num].a = m[s1], E[num].b = m[s2]; 73 E[num++].Weight = W; 74 } 75 76 if (Bellman_ford()) 77 cout << "Case " << cas << ": Yes" << endl; 78 else 79 cout << "Case " << cas << ": No" << endl; 80 81 // getchar(); 82 } 83 84 return 0; 85 }

POJ 2240 Arbitrage