Advertisement
welleyth

E5209. Продавец аквариумов

Mar 29th, 2021
1,098
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.07 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define mp make_pair
  6.  
  7. const int INF = (int)1e9;
  8.  
  9. int CountBits(int x)
  10. {
  11.     int c = 0;
  12.     while(x)
  13.     {
  14.         c += x & 1;
  15.         x >>= 1;
  16.     }
  17.     return c;
  18. }
  19.  
  20. int DropKthBit(int x,int k)
  21. {
  22.     return x - (1<<k);
  23. }
  24.  
  25. int main()
  26. {
  27.     ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  28.  
  29.     freopen("aquarium.in","r",stdin);
  30.     freopen("aquarium.out","w",stdout);
  31.  
  32.     int n;
  33.     cin >> n;
  34.  
  35.     vector<vector<int> > g(n,vector<int>(n));
  36.  
  37.     for(int i = 0; i < n; i++)
  38.     {
  39.         for(int j = 0; j < n; j++)
  40.         {
  41.             cin >> g[i][j];
  42.         }
  43.     }
  44.  
  45.     vector<vector<int> > dp(1<<14,vector<int>(14,INF));
  46.  
  47.     int x;
  48.  
  49.     for(int mask = 1; mask < (1 << n); mask++)
  50.     {
  51.         if(CountBits(mask) == 1)
  52.         {
  53.             for(int i = 0; i < n; i++)
  54.                 if(mask & (1<<i))
  55.                     dp[mask][i] = 0;
  56.         }
  57.         for(int i = 0; i < n; i++)
  58.         {
  59.             if(mask & (1<<i))
  60.             {
  61.                 for(int j = 0; j < n; j++)
  62.                 {
  63.                     if(!(mask & (1<<j)))
  64.                     {
  65.                         if(dp[mask|(1<<j)][j] > dp[mask][i] + g[i][j])
  66.                         {
  67.                             dp[mask|(1<<j)][j] = dp[mask][i] + g[i][j];
  68.                         }
  69.                     }
  70.                 }
  71.             }
  72.         }
  73.     }
  74.  
  75.     int mn;
  76.  
  77.     mn = *min_element(dp[(1<<n)-1].begin(),dp[(1<<n)-1].end());
  78.  
  79.     cout << mn << "\n";
  80.  
  81.     int t = (1<<n) - 1;
  82.     x = -1;
  83.  
  84.     for(int i = 0; i < n; i++)
  85.     {
  86.         if(dp[t][i] == mn)
  87.         {
  88.             x = i;
  89.             break;
  90.         }
  91.     }
  92.  
  93.     int K = 0;
  94.  
  95.     while(t != 0 && K < n)
  96.     {
  97.         K++;
  98.         cout << x + 1 << " ";
  99.         for(int i = 0; i < n; i++)
  100.         {
  101.             if(dp[DropKthBit(t,x)][i] + g[i][x] == dp[t][x])
  102.             {
  103.                 t = DropKthBit(t,x);
  104.                 x = i;
  105.                 break;
  106.             }
  107.         }
  108.     }
  109.  
  110.     return 0;
  111. }
  112.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement