Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma comment(linker, "/stack:200000000")
- #pragma GCC optimize("Ofast")
- #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
- #include<iostream>
- #include<cmath>
- #include<algorithm>
- #include<vector>
- #include<unordered_map>
- #include<unordered_set>
- #include<map>
- #include<algorithm>
- #include<queue>
- #include<stack>
- #include<cstdio>
- #include<cassert>
- #include<sstream>
- #include<set>
- using namespace std;
- const int INF = 1e6;
- signed main(){
- int n; cin >> n;
- vector<vector<int>> w(n, vector<int>(n));
- for(int i = 0; i < n; i++){
- for(int j = 0; j < n; j++)cin >> w[i][j];
- }
- vector<vector<int>> dp(1 << n, vector<int>(n, INF));
- vector<vector<int>> prev(1 << n, vector<int>(n, INF));
- dp[1][0] = 0;
- for(int mask = 1; mask < (1 << n); mask++){
- for(int last = 0; last < n; last++){
- int bit = (mask >> last) & 1;
- if(bit){
- for(int next = 0; next < n; next++){
- int nbit = (mask >> next) & 1;
- if(!nbit && w[last][next] > 0){
- if(dp[mask ^ (1 << next)][next] > dp[mask][last] + w[last][next]){
- dp[mask ^ (1 << next)][next] = dp[mask][last] + w[last][next];
- prev[mask ^ (1 << next)][next] = last;
- }
- }
- }
- }
- }
- }
- int ans = INF;
- int last = 0;
- for(int i = 0; i < n; i++){
- if(dp[(1 << n) - 1][i] < ans){
- ans = dp[(1 << n) - 1][i];
- last = i;
- }
- }
- if(ans > 1e5){
- cout << -1;
- return 0;
- }
- int mask = (1 << n) - 1;
- vector<int> path = {last};
- for(int i = 1; i < n; i++){
- int next = prev[mask][last];
- mask = mask ^ (1 << last);
- last = next;
- path.push_back(last);
- }
- reverse(path.begin(), path.end());
- cout << ans << "\n";
- for(auto i : path)cout << i + 1 << " ";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement