Saturday, January 26, 2019

[UVa] 515 - King

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : 515 - King
Source            : UVA Online Judge
Category          : Graph Theory
Algorithm         : System of Difference Constraints
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. #define inf           123456789  
  6.   
  7. static const int maxn = 1000 + 5;  
  8.   
  9. struct node  
  10. {  
  11.        int v, w;  
  12.        node(int v = 0, int w = 0) : v(v), w(w) {}  
  13. };  
  14.   
  15. vector <node> graph[maxn];  
  16. int n, m, k;  
  17.   
  18. set <int> allNode;  
  19.   
  20. int dist[maxn];  
  21. bool now[maxn];  
  22. int occ[maxn];  
  23.   
  24. inline bool spfa(int src, int tnode)  
  25. {  
  26.        for (int i = 0; i < maxn; i++)  
  27.        {  
  28.               dist[i] = inf;  
  29.               now[i] = 0;  
  30.               occ[i] = 0;  
  31.        }  
  32.        queue <int> PQ;  
  33.        PQ.push(src);  
  34.        dist[src] = 0;  
  35.        occ[src] = 1;  
  36.        now[src] = 1;  
  37.        while (!PQ.empty())  
  38.        {  
  39.               int u = PQ.front(); PQ.pop();  
  40.               now[u] = 0;  
  41.               for (node it : graph[u])  
  42.               {  
  43.                      int v = it.v;  
  44.                      int w = it.w;  
  45.                      if (dist[v] > dist[u] + w)  
  46.                      {  
  47.                             occ[v]++;  
  48.                             dist[v] = dist[u] + w;  
  49.                             if (!now[v]) now[v] = 1, PQ.push(v);  
  50.                      }  
  51.                      if (occ[v] > tnode) return false// found negative cycle  
  52.               }  
  53.        }  
  54.        return true;  
  55. }  
  56.   
  57. inline void addEdge(int u, int v, int w)  
  58. {  
  59.        graph[u].push_back(node(v, w));  
  60. }  
  61.   
  62. int main()  
  63. {  
  64.        //freopen("in.txt", "r", stdin);  
  65.        while (cin >> n)  
  66.        {  
  67.               if (n == 0) break;  
  68.               cin >> m;  
  69.               int si, ni, ki;  
  70.               string oi;  
  71.               for (int i = 1; i <= m; i++)  
  72.               {  
  73.                      cin >> si >> ni >> oi >> ki;  
  74.                      int ain = si + ni;  
  75.                      int ai = si - 1;  
  76.                      allNode.insert(ain+1);  
  77.                      allNode.insert(ai+1);  
  78.                      if (oi == "lt") addEdge(ai+1, ain+1, ki-1);  
  79.                      else addEdge(ain+1, ai+1, -(ki+1));  
  80.               }  
  81.               int src = 0;  
  82.               for (int x : allNode) addEdge(src, x, 0);  
  83.               int tnode = allNode.size() + 1;  
  84.               bool negativeCycle = spfa(0, tnode);  
  85.               if (negativeCycle == false) cout << "successful conspiracy\n";  
  86.               else cout << "lamentable kingdom\n";  
  87.               allNode.clear();  
  88.               for (int i = 0; i < maxn; i++) graph[i].clear();  
  89.        }  
  90. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.