Vserosbuybuy

Dijkstra, Floid and Ford-Bellman

Jun 11th, 2020
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <set>
  5. #include <queue>
  6.  
  7. using namespace std;
  8.  
  9. const int inf = 1e9;
  10.  
  11. int dist[100000];
  12. bool used[100000];
  13. int mas[1000][1000];
  14. vector<pair<int, int>> ans;
  15. int pr[1000][1000];
  16. pair<int, int> put[1000][1000];
  17. vector<pair<int, int>> matr[100000];
  18.  
  19. int w[1000][1000];
  20.  
  21. void floid(int n) {
  22.     for (int i = 0; i < n; ++i) {
  23.         fill(w[i], w[i] + n, inf);
  24.         for (auto u : matr[i]) {
  25.             w[i][u.second] = u.first;
  26.         }
  27.     }
  28.     for (int k = 0; k < n; ++k) {
  29.         for (int i = 0; i < n; ++i) {
  30.             for (int j = 0; j < n; ++j) {
  31.                 w[i][j] = min(w[i][j], w[i][k] + w[k][j]);
  32.             }
  33.         }
  34.     }
  35. }
  36.  
  37. struct S {
  38.     int from;
  39.     int to;
  40.     int cost;
  41. };
  42.  
  43. vector<S> edges;
  44.  
  45. void ford_bellman(int v, int n, int m) {
  46.     vector<int> dist(n, inf);
  47.     dist[v] = 0;
  48.     for (int i = 0; i < n - 1; ++i) {
  49.         bool change = false;
  50.         for (int j = 0; j < edges.size(); ++j) {
  51.             int v = edges[j].from;
  52.             int u = edges[j].to;
  53.             if (dist[v] < inf)
  54.                 if (dist[u] > dist[v] + edges[j].cost) {
  55.                     dist[u] = dist[v] + edges[j].cost;
  56.                     change = true;
  57.                 }
  58.         }
  59.         if (!change)  break;
  60.     }
  61. }
  62.  
  63. // с восстановлением пути
  64. void ford_bellman_paths(int v, int n, int m) {
  65.     vector<int> pr(n, -1);
  66.     vector<int> dist(n, inf);
  67.     dist[v] = 0;
  68.     for (int i = 0; i < n - 1; ++i) {
  69.         bool change = false;
  70.         for (int j = 0; j < edges.size(); ++j) {
  71.             int v = edges[j].from;
  72.             int u = edges[j].to;
  73.             if (dist[v] < inf) {
  74.                 if (dist[u] > dist[v] + edges[j].cost) {
  75.                     dist[u] = dist[v] + edges[j].cost;
  76.                     pr[u] = v;
  77.                     change = true;
  78.                 }
  79.             }
  80.         }
  81.         if (!change)  break;
  82.     }
  83.     // check path from v to u
  84.     if (dist[u] == inf) {
  85.         // no path
  86.     }
  87.     else {
  88.         vector<int> path;
  89.         for (int cur_v = u; cur_v != -1; cur_v = pr[cur_v]) {
  90.             path.push_back(cur_v);
  91.         }
  92.         reverse(path.begin(), path.end());
  93.  
  94.         // path is in path vector
  95.     }
  96. }
  97.  
  98. void ford_bellman_negative_cycles(int v, int n, int m) {
  99.     vector<int> pr(n, -1);
  100.     vector<int> dist(n, inf);
  101.     dist[v] = 0;
  102.     int changed_v = -1;
  103.     for (int i = 0; i < n; ++i) {
  104.         changed_v = -1;
  105.         for (int j = 0; j < edges.size(); ++j) {
  106.             int v = edges[j].from;
  107.             int u = edges[j].to;
  108.             if (dist[v] < inf) {
  109.                 if (dist[u] > dist[v] + edges[j].cost) {
  110.                     dist[u] = dist[v] + edges[j].cost;
  111.                     pr[u] = v;
  112.                     changed_v = u;
  113.                 }
  114.             }
  115.         }
  116.     }
  117.    
  118.     if (changed_v == -1) {
  119.         // no negative cycle
  120.     }
  121.     else {
  122.         for (int i = 0; i < n - 1; ++i) {
  123.             changed_v = pr[changed_v];
  124.         }
  125.         // теперь changed_v на отрицательном цикле
  126.         vector<int> path;
  127.         for (int cur_v = changed_v;; cur_v = pr[cur_v]) {
  128.             if (cur_v == changed_v && path.size() > 0) {
  129.                 break;
  130.             }
  131.             path.push_back(cur_v);
  132.         }
  133.         reverse(path.begin(), path.end());
  134.  
  135.         // cycle is in path vector
  136.     }
  137. }
  138.  
  139. struct S {
  140.     int dist;
  141.     int v;
  142.     int pr;
  143.  
  144.     bool operator < (const S& a) const {
  145.         return dist < a.dist;
  146.     }
  147. };
  148.  
  149. int main() {
  150. #ifdef SYSTEM
  151.     freopen("input.txt", "r", stdin);
  152.     freopen("output.txt", "w", stdout);
  153. #endif
  154.  
  155.     int n;
  156.     fill(dist, dist + n, inf);
  157.  
  158.     dist[0] = 0;
  159.     while (true) {
  160.         pair<int, int> v = { inf, -1 }; // пара расстояние, номер вершины
  161.         for (int i = 0; i < n; ++i) {
  162.             if (!used[i] && dist[i] < v.first) {
  163.                 v = { dist[i], i };
  164.             }
  165.         }
  166.         if (v.second == -1 || v.first == inf) {
  167.             break;
  168.         }
  169.         used[v.second] = 1;
  170.         for (int i = 0; i < matr[v.second].size(); ++i) {
  171.             auto u = matr[v.second][i]; // пара величина ребра, номер вершины, в которую ведет ребро
  172.             if (!used[u.second]) {
  173.                 if ()
  174.                     pr[u.second] = v.second;
  175.                 dist[u.second] = min(dist[u.second], v.first + u.first);
  176.             }
  177.         }
  178.     }
  179.  
  180.     fill(dist, dist + n, -1);
  181.  
  182.     int pr[100000];
  183.     fill(pr, pr + n, -1);
  184.     set<pair<int, pair<int, int>>> s;
  185.     s.insert({ 0, {0, -1} });
  186.     while (s.size()) {
  187.         auto v = *s.begin(); // пара расстояние, номер вершины
  188.         s.erase(s.begin());
  189.         while (dist[v.second.first] != -1 && s.size()) {
  190.             v = *s.begin();
  191.             s.erase(s.begin());
  192.         }
  193.         if (s.empty() && dist[v.second.first] != -1) {
  194.             break;
  195.         }
  196.         dist[v.second.first] = v.first;
  197.         pr[v.second.first] = v.second.second
  198.         for (int i = 0; i < matr[v.second.first].size(); ++i) {
  199.             auto u = matr[v.second.first][i]; // пара величина ребра, номер вершины, в которую ведет ребро
  200.             if (dist[u.second.first] == -1) {
  201.                 s.insert({ v.first + u.first, {u.second, v.second.first} });
  202.                 pr[u.second] = v.second;
  203.             }
  204.         }
  205.     }
  206. }
Advertisement
Add Comment
Please, Sign In to add comment