Advertisement
Guest User

Untitled

a guest
Dec 15th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. #pragma comment(linker, "/stack:200000000")
  2. #pragma GCC optimize("Ofast")
  3. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  4. #include<iostream>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<vector>
  8. #include<unordered_map>
  9. #include<unordered_set>
  10. #include<map>
  11. #include<algorithm>
  12. #include<queue>
  13. #include<stack>
  14. #include<cstdio>
  15. #include<cassert>
  16. #include<sstream>
  17. #include<set>
  18.  
  19. using namespace std;
  20.  
  21. const int INF = 1e6;
  22.  
  23. signed main(){
  24.     int n; cin >> n;
  25.     vector<vector<int>> w(n, vector<int>(n));
  26.     for(int i = 0; i < n; i++){
  27.         for(int j = 0; j < n; j++)cin >> w[i][j];
  28.     }
  29.     vector<vector<int>> dp(1 << n, vector<int>(n, INF));
  30.     vector<vector<int>> prev(1 << n, vector<int>(n, INF));
  31.     dp[1][0] = 0;
  32.     for(int mask = 1; mask < (1 << n); mask++){
  33.         for(int last = 0; last < n; last++){
  34.             int bit = (mask >> last) & 1;
  35.             if(bit){
  36.                 for(int next = 0; next < n; next++){
  37.                     int nbit = (mask >> next) & 1;
  38.                     if(!nbit && w[last][next] > 0){
  39.                         if(dp[mask ^ (1 << next)][next] > dp[mask][last] + w[last][next]){
  40.                             dp[mask ^ (1 << next)][next] = dp[mask][last] + w[last][next];
  41.                             prev[mask ^ (1 << next)][next] = last;
  42.                         }
  43.                     }
  44.                 }
  45.             }
  46.         }
  47.     }
  48.     int ans = INF;
  49.     int last = 0;
  50.     for(int i = 0; i < n; i++){
  51.         if(dp[(1 << n) - 1][i] < ans){
  52.             ans = dp[(1 << n) - 1][i];
  53.             last = i;
  54.         }
  55.     }
  56.     if(ans > 1e5){
  57.         cout << -1;
  58.         return 0;
  59.     }
  60.     int mask = (1 << n) - 1;
  61.     vector<int> path = {last};
  62.     for(int i = 1; i < n; i++){
  63.         int next = prev[mask][last];
  64.         mask = mask ^ (1 << last);
  65.         last = next;
  66.         path.push_back(last);
  67.     }
  68.     reverse(path.begin(), path.end());
  69.     cout << ans << "\n";
  70.     for(auto i : path)cout << i + 1 << " ";
  71.     return 0;
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement