Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.32 KB | None | 0 0
  1. const int N = 10 * 1000 + 13;
  2. const int M = 100 * 1000 + 13;
  3.  
  4. const int INF = int(1e9);
  5. const int MIN_VAL = -INF;
  6.  
  7. int n, m;
  8. pair<pair<int, int>, int> g[M];
  9. int d[N];
  10. int p[N];
  11. int used[N];
  12.  
  13. void fordBellman(int s) {
  14.     for (int i = 0; i < n; i++)
  15.         d[i] = INF;
  16.  
  17.     d[s] = 0;
  18.  
  19.     for (int it = 0; it < n; it++) {
  20.         bool wasRelax = false;
  21.  
  22.         for (int i = 0; i < m; i++) {
  23.             int x = g[i].x.x, y = g[i].x.y, l = g[i].y;
  24.  
  25.             if (d[x] != INF && d[y] > d[x] + l) {
  26.                 d[y] = max(MIN_VAL, d[x] + l);
  27.                 p[y] = x;
  28.                 wasRelax = true;
  29.             }
  30.         }
  31.  
  32.         if (!wasRelax)
  33.             break;
  34.     }
  35.  
  36.     bool negCycleVert = -1;
  37.  
  38.     for (int i = 0; i < m; i++) {
  39.         int x = g[i].x.x, y = g[i].x.y, l = g[i].y;
  40.  
  41.         if (d[x] != INF && d[y] > d[x] + l) {
  42.             negCycleVert = x;
  43.             d[y] = MIN_VAL - 1;
  44.         }
  45.     }
  46.  
  47.     if (negCycleVert != -1) {
  48.         int v = negCycleVert;
  49.         while (!used[v]) {
  50.             used[v] = 1;
  51.             v = p[v];
  52.         }
  53.  
  54.         vector<int> ans;
  55.         int s = v;
  56.         v = p[v];
  57.         while (v != s) {
  58.             ans.pb(v);
  59.             v = p[v];
  60.         }
  61.         ans.pb(s);
  62.  
  63.         cout << sz(ans) << endl;
  64.         for (int i = 0; i < n; i++)
  65.             cout << ans[i] + 1 << ' ';
  66.         cout << endl;
  67.     }
  68.  
  69.     for (int i = 0; i < n; i++) {
  70.         if (d[i] == INF)
  71.             cout << "No path" << endl;
  72.         else if (d[i] == MIN_VAL - 1)
  73.             cout << "Infinity small path" << endl;
  74.         else
  75.             cout << d[i] << endl;
  76.     }
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement