Advertisement
Zuneve

фцв

Jan 12th, 2024
639
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.90 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using ll = long long;
  5. const int INF = 1e9 + 7;
  6.  
  7. signed main() {
  8.     cout.precision(30);
  9.     ios_base::sync_with_stdio(false);
  10.     cin.tie(nullptr);
  11.     ll n;
  12.     cin >> n;
  13.     vector<vector<ll>> gr(n, vector<ll>(n));
  14.     for (ll i = 0; i < n; i++) {
  15.         for (ll j = 0; j < n; j++) {
  16.             cin >> gr[i][j];
  17.         }
  18.     }
  19.     ll dp[1 << n][n];
  20.     for (ll mask = 0; mask < (1 << n); mask++) {
  21.         for (ll i = 0; i < n; i++) {
  22.             dp[mask][i] = INF;
  23.         }
  24.     }
  25.     dp[1][0] = 0;
  26.     vector<vector<pair<ll, ll>>> from(1 << n, vector<pair<ll, ll>>(n, {-1, -1}));
  27.     for (ll mask = 1; mask < (1 << n); mask++) {
  28.         for (ll i = 0; i < n; i++) {
  29.             if (!((mask >> i) & 1)) continue;
  30.             for (ll j = 0; j < n; j++) {
  31.                 if (!gr[i][j] || ((mask >> j) & 1)) continue;
  32.                 if (dp[mask | (1 << j)][j] > dp[mask][i] + gr[i][j]) {
  33.                     dp[mask | (1 << j)][j] = dp[mask][i] + gr[i][j];
  34.                     from[mask | (1 << j)][j] = {mask, i};
  35.                 }
  36.             }
  37.         }
  38.     }
  39.     ll mn = INF;
  40.     pair<ll, ll> last;
  41.     for (ll i = 0; i < n; i++) {
  42.         if (mn > dp[(1 << n) - 1][i]) {
  43.             mn = dp[(1 << n) - 1][i];
  44.             last = {(1 << n) - 1, i};
  45.         }
  46.     }
  47.     vector<ll> ans(n);
  48.     if (mn == INF) {
  49.         cout << -1;
  50.         return 0;
  51.     } else {
  52.         ll cnt = 0, sm = 0;
  53.         while (last.first != -1) {
  54.             if (from[last.first][last.second].first != -1) {
  55.                 sm += gr[last.second][from[last.first][last.second].second];
  56.             }
  57.             ans[cnt++] = last.second;
  58.             last = from[last.first][last.second];
  59.         }
  60.         cout << sm << '\n';
  61.         std::reverse(ans.begin(), ans.end());
  62.         for (ll i : ans) {
  63.             cout << i + 1 << ' ';
  64.         }
  65.     }
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement