Advertisement
Okorosso

Коммивояжер возвращается

Jun 29th, 2021
969
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <fstream>
  2. #include <algorithm>
  3. #define INF 9223372036854775807
  4. std::ifstream fin("input.txt");
  5. std::ofstream fout("output.txt");
  6. int** matrix;
  7. long long** dp;
  8. int n;
  9.  
  10. int main(int argc, char* argv[]) {
  11.     fin >> n;
  12.     //adjacency matrix
  13.     matrix = new int*[n];
  14.     for (int i = 0; i < n; i++) {
  15.         matrix[i] = new int[n];
  16.         for (int j = 0; j < n; j++)
  17.             fin >> matrix[i][j];
  18.     }
  19.     //dp
  20.     dp = new long long*[1 << n];
  21.     for (int i = 0; i < (1 << n) + 1; i++) {
  22.         dp[i] = new long long[n];
  23.         for (int j = 0; j < n; j++)
  24.             dp[i][j] = INF;
  25.     }
  26.     //start pos
  27.     for (int i = 0; i < n; i++)
  28.         dp[1 << i][i] = 0;
  29.     //main
  30.     for (int mask = 1; mask < 1 << n; mask++) {
  31.         for (int cur_planet = 0; cur_planet < n; cur_planet++) {
  32.             if (dp[mask][cur_planet] == INF) continue;
  33.             for (int tg_planet = 0; tg_planet < n; tg_planet++) {
  34.                 if (!(mask & (1 << tg_planet)) && matrix[cur_planet][tg_planet] != -1) {
  35.                     dp[mask ^ (1 << tg_planet)][tg_planet] = std::min(dp[mask ^ (1 << tg_planet)][tg_planet], dp[mask][cur_planet] + matrix[cur_planet][tg_planet]);
  36.                 }
  37.             }
  38.         }
  39.     }
  40.     //out
  41.     long long min = INF;
  42.     for (int planet = 0; planet < n; planet++) {
  43.         if (dp[(1 << n) - 1][planet] < min) min = dp[(1 << n) - 1][planet];
  44.     }
  45.     fout << min;
  46.     return 0;
  47. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement