Saturday, January 26, 2019

[POJ] 1201 - Intervals

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : 1201 - Intervals
Source            : POJ
Category          : Graph Theory
Algorithm         : System of Difference Constraints
Verdict           : Accepted

  1. #include <iostream>  
  2. #include <vector>  
  3. #include <queue>  
  4.   
  5. using namespace std;  
  6.   
  7. static const int maxn = 50000 + 5;  
  8. static const int inf  = 1e6+9;  
  9.   
  10. struct edge  
  11. {  
  12.       int u, v, w;  
  13.       edge(int uu = 0, int vv = 0, int ww = 0) : u(uu), v(vv), w(ww) {}  
  14. };  
  15.   
  16. struct node  
  17. {  
  18.     int v, w;  
  19.     node(int vv = 0, int ww = 0) : v(vv), w(ww) {}  
  20. };  
  21.   
  22. vector <edge> edgeList;  
  23. vector <node> graph[maxn];  
  24. int tinterval;  
  25. int dis[maxn], now[maxn], cnt[maxn];  
  26.   
  27. inline void spfa(int src = 0)  
  28. {  
  29.       for (int i = 0; i < maxn; i++)  
  30.       {  
  31.             dis[i] = inf;  
  32.             now[i] = 0;  
  33.             cnt[i] = 0;  
  34.       }  
  35.       queue <int> PQ;  
  36.       PQ.push(src);  
  37.       dis[src] = 0;  
  38.       cnt[src] = 1;  
  39.       now[src] = 1;  
  40.       while (!PQ.empty())  
  41.       {  
  42.             int u = PQ.front(); PQ.pop();  
  43.             now[u] = 0;  
  44.             //if (cnt[u] > tinterval)  // negative cycle found  
  45.             //    return false;  
  46.             for (vector <node>::iterator it = G[u].begin(); it != G[u].end(); it++)  
  47.             {  
  48.                   int v = it->v;  
  49.                   int w = it->w;  
  50.                   if (dis[v] > dis[u] + w)  
  51.                   {  
  52.                   dis[v] = dis[u] + w;  
  53.                   //cnt[v]++;  
  54.                   if (!now[v]) PQ.push(v), now[v] = 1;  
  55.                   }  
  56.             }  
  57.       }  
  58. }  
  59.   
  60. inline void createGraph(int maxi)  
  61. {  
  62.       for (vector<edge>::iterator it = E.begin(); it != E.end(); it++)  
  63.       {  
  64.             int u = it->u, v = it->v, w = it->w;  
  65.             graph[v].push_back(node(u, -w));  
  66.       }  
  67.       for (int i = 1; i < maxi; i++)  
  68.       {  
  69.             G[i].push_back(node(i+1, 1));  
  70.             G[i+1].push_back(node(i, 0));  
  71.       }  
  72.       for (int i = 1; i <= maxi; i++)  
  73.       {  
  74.             G[0].push_back(node(i, 0));  
  75.       }  
  76. }  
  77.   
  78. int main()  
  79. {  
  80.       //freopen("in.txt", "r", stdin);  
  81.   
  82.       scanf("%d", &tinterval);  
  83.       int maxi = -1;  
  84.       int mini = inf;  
  85.       for (int i = 0; i < tinterval; i++)  
  86.       {  
  87.             int u, v, w;  
  88.             scanf("%d %d %d", &u, &v, &w);  
  89.             u += 1;  
  90.             v += 2;  
  91.             edgeList.push_back(edge(u, v, w));  
  92.             maxi = max(maxi, max(u, v));  
  93.             mini = min(mini, min(u, v));  
  94.       }  
  95.       createGraph(maxi);  
  96.       spfa();  
  97.       printf("%d\n", -dis[mini]);  
  98. }  

No comments:

Post a Comment

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