Ranking (as of 2013-06-13): 172 out of 348
Language: C++
/* UVa 515 - King To build using Visucal Studio 2008: cl -EHsc king.cpp */ #include <iostream> #include <string> #include <vector> #include <limits> #include <algorithm> using namespace std; struct edge { int u_; // source vertex int v_; // destination vertex int weight_; edge() : u_(-1), v_(-1), weight_(-1) {} edge(int u, int v, int weight) : u_(u), v_(v), weight_(weight) {} }; bool bellman_ford(int n, int source, const vector<edge>& edges) { // initialize the graph vector<int> distances(n, numeric_limits<int>::max()); distances[source] = 0; // relax the edges repeatedly for (int i = 0; i < n - 1; i++) for (size_t j = 0, je = edges.size(); j < je; j++) { const edge& e = edges[j]; if (distances[e.u_] + e.weight_ < distances[e.v_]) distances[e.v_] = distances[e.u_] + e.weight_; } // check for negative-weight cycles for (size_t i = 0, ie = edges.size(); i < ie; i++) { const edge& e = edges[i]; if (distances[e.u_] + e.weight_ < distances[e.v_]) return true; // the graph contains a negative-weight cycle } return false; } int main() { while (true) { int n; cin >> n; if (!n) break; int m; cin >> m; vector<edge> edges(n + m + 1); int i; for (i = 0; i < n + 1; i++) edges[i] = edge(n + 1, i, 0); // edges from specical vertex (n + 1) to any other vertex for ( ; i < n + m + 1; i++) { int j, k, c; string op; cin >> j >> k >> op >> c; k += j; j--; if (op == "gt") { swap(j, k); c++; c = -c; } else c--; edges[i] = edge(j, k, c); } // Bellman-Ford's shortest path algorithm should start // from the special vertex (n + 1) cout << ((bellman_ford(n + 2, n + 1, edges)) ? "successful conspiracy\n" : "lamentable kingdom\n"); } return 0; }
No comments:
Post a Comment