niyaznigmatullin

Untitled

Jun 3rd, 2014
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cassert>
  3. #include <algorithm>
  4. #include <vector>
  5.  
  6. using std::vector;
  7.  
  8. const int INF = 1 << 30;
  9.  
  10. int main() {
  11.   int n;
  12.   scanf("%d", &n);
  13.   vector<vector<int> > a(n, vector<int>(n));
  14.   for (int i = 0; i < n; i++) {
  15.     for (int j = 0; j < n; j++) {
  16.       int x;
  17.       scanf("%d", &x);
  18.       a[i][j] = x;
  19.     }
  20.   }
  21.   vector<vector<int> > dp(1 << n, vector<int> (n, INF));
  22.   for (int mask = 1; mask < 1 << n; mask++) { // calculating DP
  23.     if ((mask & (mask - 1)) == 0) {
  24.       for (int i = 0; i < n; i++) if (((mask >> i) & 1) == 1) {
  25.         dp[mask][i] = 0;
  26.       }
  27.       continue;
  28.     }
  29.     for (int last = 0; last < n; last++) {
  30.       if (((mask >> last) & 1) == 0) continue;
  31.       for (int prev = 0; prev < n; prev++) {
  32.         int val = dp[mask ^ (1 << last)][prev];
  33.         if (last == prev || ((mask >> prev) & 1) == 0 || val == INF) continue;
  34.         dp[mask][last] = std::min(dp[mask][last], val + a[prev][last]);
  35.       }
  36.     }
  37.   }
  38.   int ans = INF;
  39.   int last = -1;
  40.   for (int i = 0; i < n; i++) { // finding best ''last'' vertex
  41.     if (ans > dp[(1 << n) - 1][i]) {
  42.       ans = dp[(1 << n) - 1][i];
  43.       last = i;
  44.     }
  45.   }
  46.   vector<int> path(n);
  47.   int ac = n;
  48.   for (int mask = (1 << n) - 1; ; ) { // restoring the answer using DP values
  49.     path[--ac] = last;
  50.     int cur = dp[mask][last];
  51.     mask ^= 1 << last;
  52.     if (mask == 0) break;
  53.     int newLast = -1;
  54.     for (int prev = 0; prev < n; prev++) {
  55.       if (((mask >> prev) & 1) == 1 && cur == dp[mask][prev] + a[prev][last]) {
  56.         newLast = prev;
  57.         break;
  58.       }
  59.     }
  60.     assert(newLast >= 0);
  61.     last = newLast;
  62.   }
  63.   printf("%d\n", ans);
  64.   for (int i = 0; i < n; i++) {
  65.     if (i > 0) putchar(' ');
  66.     printf("%d", path[i] + 1);
  67.   }
  68.   puts("");
  69. }
Advertisement
Add Comment
Please, Sign In to add comment