Advertisement
dipBRUR

System Of Difference Constraints

Oct 4th, 2018
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.99 KB | None | 0 0
  1. #define inf                  1e7  
  2. static const int maxn = 1e3 + 5;  
  3.  
  4. struct edge  
  5. {  
  6.     int u, v, w;  
  7.     edge(int uu = 0, int vv = 0, int ww = 0) : u(uu), v(vv), w(ww) {}  
  8. };  
  9. struct node  
  10. {  
  11.     int v, w;  
  12.     node(int vv = 0, int ww = 0) : v(vv), w(ww) {}  
  13. };  
  14. vector <edge> edgeList;  
  15. vector <node> graph[maxn];  
  16. int tnode, tedge;  
  17. int dis[maxn], now[maxn], cnt[maxn];  
  18.  
  19. bool spfa(int s = 0)  
  20. {  
  21.     for (int i = 0; i < maxn; i++)  
  22.     {  
  23.         dis[i] = inf;  
  24.         now[i] = 0;  
  25.         cnt[i] = 0;  
  26.     }  
  27.     queue <int> PQ;  
  28.     PQ.push(s);  
  29.     dis[s] = 0;  
  30.     now[s] = 1;  
  31.     cnt[s] = 1;  
  32.     while (!PQ.empty())  
  33.     {  
  34.         int u = PQ.front(); PQ.pop();  
  35.         now[u] = 0;  
  36.         if (cnt[u] > tnode) // negative cycle found  
  37.             return false;  
  38.         for (auto &it : graph[u])  
  39.         {  
  40.             int v = it.v;  
  41.             int w = it.w;  
  42.             if (dis[v] > dis[u] + w)  
  43.             {  
  44.                 dis[v] = dis[u] + w;  
  45.                 cnt[v]++;  
  46.                 if (!now[v])  
  47.                 {  
  48.                     now[v] = 1;  
  49.                     PQ.push(v);  
  50.                 }  
  51.             }  
  52.         }  
  53.     }  
  54.     return true;  
  55. }  
  56.  
  57. bool solve(int m)  
  58. {  
  59.     for (int i = 0; i < maxn; i++)  
  60.         graph[i].clear();  
  61.     for (auto &it : edgeList)  
  62.     {  
  63.         graph[it.v].push_back(node(it.u, it.w-m));  
  64.         graph[0].push_back(node(it.u, 0));  
  65.         graph[0].push_back(node(it.v, 0));  
  66.     }  
  67.     return spfa();  
  68. }  
  69.  
  70. int main()  
  71. {  
  72.     while (scanf("%d %d", &tnode, &tedge) == 2)  
  73.     {  
  74.         edgeList.clear();  
  75.         int maxweight = -inf;  
  76.         for (int e = 0; e < tedge; e++)  
  77.         {  
  78.             int u, v, w;  
  79.             scanf("%d %d %d", &u, &v, &w);  
  80.             edgeList.push_back(edge(u, v, w));  
  81.             maxweight = max(maxweight, w);  
  82.         }  
  83.         if (solve(maxweight))  
  84.         {  
  85.             printf("Infinite\n");  
  86.             continue;  
  87.         }  
  88.         int low = 1;  
  89.         int high = maxweight;  
  90.         int ans = -1;  
  91.         while (low <= high)  
  92.         {  
  93.             int mid = (low+high)>>1;  
  94.             if (solve(mid))  
  95.                 ans = mid, low = mid+1;  
  96.             else  
  97.                 high = mid-1;  
  98.         }  
  99.         if (ans == -1)  
  100.             printf("No Solution\n");  
  101.         else  
  102.             printf("%d\n", ans);  
  103.     }  
  104. }  #define inf                  1e7  
  105. static const int maxn = 1e3 + 5;  
  106.  
  107. struct edge  
  108. {  
  109.     int u, v, w;  
  110.     edge(int uu = 0, int vv = 0, int ww = 0) : u(uu), v(vv), w(ww) {}  
  111. };  
  112. struct node  
  113. {  
  114.     int v, w;  
  115.     node(int vv = 0, int ww = 0) : v(vv), w(ww) {}  
  116. };  
  117. vector <edge> edgeList;  
  118. vector <node> graph[maxn];  
  119. int tnode, tedge;  
  120. int dis[maxn], now[maxn], cnt[maxn];  
  121.  
  122. bool spfa(int s = 0)  
  123. {  
  124.     for (int i = 0; i < maxn; i++)  
  125.     {  
  126.         dis[i] = inf;  
  127.         now[i] = 0;  
  128.         cnt[i] = 0;  
  129.     }  
  130.     queue <int> PQ;  
  131.     PQ.push(s);  
  132.     dis[s] = 0;  
  133.     now[s] = 1;  
  134.     cnt[s] = 1;  
  135.     while (!PQ.empty())  
  136.     {  
  137.         int u = PQ.front(); PQ.pop();  
  138.         now[u] = 0;  
  139.         if (cnt[u] > tnode) // negative cycle found  
  140.             return false;  
  141.         for (auto &it : graph[u])  
  142.         {  
  143.             int v = it.v;  
  144.             int w = it.w;  
  145.             if (dis[v] > dis[u] + w)  
  146.             {  
  147.                 dis[v] = dis[u] + w;  
  148.                 cnt[v]++;  
  149.                 if (!now[v])  
  150.                 {  
  151.                     now[v] = 1;  
  152.                     PQ.push(v);  
  153.                 }  
  154.             }  
  155.         }  
  156.     }  
  157.     return true;  
  158. }  
  159.  
  160. bool solve(int m)  
  161. {  
  162.     for (int i = 0; i < maxn; i++)  
  163.         graph[i].clear();  
  164.     for (auto &it : edgeList)  
  165.     {  
  166.         graph[it.v].push_back(node(it.u, it.w-m));  
  167.         graph[0].push_back(node(it.u, 0));  
  168.         graph[0].push_back(node(it.v, 0));  
  169.     }  
  170.     return spfa();  
  171. }  
  172.  
  173. int main()  
  174. {  
  175.     while (scanf("%d %d", &tnode, &tedge) == 2)  
  176.     {  
  177.         edgeList.clear();  
  178.         int maxweight = -inf;  
  179.         for (int e = 0; e < tedge; e++)  
  180.         {  
  181.             int u, v, w;  
  182.             scanf("%d %d %d", &u, &v, &w);  
  183.             edgeList.push_back(edge(u, v, w));  
  184.             maxweight = max(maxweight, w);  
  185.         }  
  186.         if (solve(maxweight))  
  187.         {  
  188.             printf("Infinite\n");  
  189.             continue;  
  190.         }  
  191.         int low = 1;  
  192.         int high = maxweight;  
  193.         int ans = -1;  
  194.         while (low <= high)  
  195.         {  
  196.             int mid = (low+high)>>1;  
  197.             if (solve(mid))  
  198.                 ans = mid, low = mid+1;  
  199.             else  
  200.                 high = mid-1;  
  201.         }  
  202.         if (ans == -1)  
  203.             printf("No Solution\n");  
  204.         else  
  205.             printf("%d\n", ans);  
  206.     }  
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement