Advertisement
AlexG2230954

Untitled

Mar 25th, 2022
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.67 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5. using graph = vector< vector<int> >;
  6. using min_way_matr = vector< vector<int> >;
  7.  
  8. const int INF = 10000;
  9.  
  10. // нахождение минимального пути, оканчивающегося на точке u
  11. int solve(int u, int mask, const graph & g, min_way_matr & dp) {
  12.     int n = g.size();
  13.  
  14.     // если минимальный путь уже найден
  15.     if(dp[u][mask] != -1) return dp[u][mask];
  16.  
  17.     // если точки u нет в подмножестве
  18.     if(!(mask & (1 << u))) return INF;
  19.  
  20.     dp[u][mask] = INF;
  21.     for(int v = 0; v < n; v++)
  22.         dp[u][mask] = min(
  23.             dp[u][mask],
  24.             solve(v, mask ^ (1 << u), g, dp) + g[u][v]
  25.         );
  26.  
  27.     return dp[u][mask];
  28. }
  29.  
  30. int main() {
  31.     int n; // кол-во точек в графе
  32.     int ans; // минимальный гамильтонов путь (ответ на задачу)
  33.     int start = 0; // начальная точка (n - 1)
  34.     graph g; // граф, в котором ищем гамильтонов путь
  35.    
  36.     min_way_matr dp;
  37.     /*
  38.         dp[i][mask] показывает минимальный гамильтонов путь, оканчивающийся
  39.         точкой i и содержащий точки, находящиеся в подмножестве mask
  40.         mask = 110101 <=> {0, 2, 4, 5}
  41.     */
  42.  
  43.     cin >> n;
  44.     g.resize(n, vector<int>(n));
  45.     dp.resize(n, vector<int>(1 << n, -1));
  46.  
  47.     for(int i = 0; i < n; i++)
  48.         for(int j = 0; j < n; j++)
  49.             cin >> g[i][j];
  50.  
  51.     dp[start][1 << start] = 0;
  52.  
  53.     ans = INF;
  54.     for(int i = 0; i < n; i++)
  55.         ans = min(
  56.             ans,
  57.             solve(i, (1 << n) - 1, g, dp)
  58.         );
  59.  
  60.     cout << "Minimal way : " << ans << endl;
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement