Advertisement
TAImatem

Графы

Jan 11th, 2023
723
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.15 KB | None | 0 0
  1. void Djekstra(int s, int n, const vector<vector<pair<int, int>>>& neighbors, vector<int>& out_dist, vector<int>& out_prev)
  2. {
  3.     out_dist.resize(n, INT32_MAX);
  4.     out_prev.resize(n, -1);
  5.     priority_queue<pair<int, int>> que;
  6.     out_dist[s] = 0;
  7.     que.push({ 0,s });
  8.     vector<bool> pass(n, 0);
  9.     while (que.size())
  10.     {
  11.         int v = que.top().second;
  12.         pass[v] = 1;
  13.         que.pop();
  14.         for (auto& u : neighbors[v])
  15.         {
  16.             if (out_dist[v] + u.second < out_dist[u.first])
  17.             {
  18.                 out_dist[u.first] = out_dist[v] + u.second;
  19.                 out_prev[u.first] = v;
  20.                 que.push({ -out_dist[u.first], u.first });
  21.             }
  22.         }
  23.         while (que.size() && pass[que.top().second]) que.pop();
  24.     }
  25. }
  26.  
  27. struct edge
  28. {
  29.     int u, v, cost;
  30. };
  31.  
  32. int Ford_Bellmann(int s, int n, const vector<edge>& edges, vector<int>& out_dist, vector<int>& out_prev)
  33. {
  34.     out_dist.resize(n, INT32_MAX);
  35.     out_prev.resize(n, -1);
  36.     out_dist[s] = 0;
  37.     int i = 0;
  38.     int updated;
  39.     for (i = 0; i < n; i++)
  40.     {
  41.         updated = -1;
  42.         for (auto& ed : edges)
  43.         {
  44.             if (out_dist[ed.u]<INT32_MAX && out_dist[ed.v] > out_dist[ed.u] + ed.cost)
  45.             {
  46.                 updated = ed.v;
  47.                 out_dist[ed.v] = out_dist[ed.u] + ed.cost;
  48.                 out_prev[ed.v] = ed.u;
  49.             }
  50.         }
  51.         if (updated >= 0)
  52.             break;
  53.     }
  54.     return updated;
  55. }
  56.  
  57.  
  58. void Floyd_Warshall(int n, const vector<vector<int>>& init_d, vector<vector<int>>& out_d, vector<vector<int>>& out_p)
  59. {
  60.     out_d = init_d;
  61.     out_p = vector<vector<int>>(n, vector<int>(n, -1));
  62.     for (int i = 0; i < n; i++)
  63.         for (int j = 0; j < n; j++)
  64.             for (int k = 0; k < n; k++)
  65.                 if (out_d[i][k] < INT32_MAX && out_d[k][j] < INT32_MAX && out_d[i][j] > out_d[i][k] + out_d[k][j])
  66.                 {
  67.                     out_p[i][j] = k;
  68.                     out_d[i][j] = out_d[i][k] + out_d[k][j];
  69.                 }
  70. }
  71.  
  72. void get_path_Floyd_Warshall(int i, int j, vector<int>& out_path, const vector<vector<int>>& p)
  73. {
  74.     int k = p[i][j];
  75.     if (k < 0)
  76.         return;
  77.     get_path_Floyd_Warshall(i, k, out_path, p);
  78.     out_path.push_back(k);
  79.     get_path_Floyd_Warshall(k, j, out_path, p);
  80. }
  81. void get_path_Floyd_Warshall_start(int i, int j, vector<int>& out_path, const vector<vector<int>>& p)
  82. {
  83.     out_path = { i };
  84.     get_path_Floyd_Warshall(i, j, out_path, p);
  85.     out_path.push_back(j);
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement