#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef pair pii; const int inf = 1000*1000*1000+100; const int maxn = 200; const double eps = 1e-7; int n; int rem; double dist[maxn][maxn]; double B; double l; int mark[maxn]; vector path; vector best; double g(int v) { double ret=0; for(int i=0; i < n ; ++i) { if(!mark[i]) { double mi = inf; for(int j=0 ; j < n ; ++j) if( (!mark[j]||j==v) && j!=i) mi=min(mi,dist[j][i]); ret+=mi; } } return ret; } void BnB(int v) { if(v==0 ){ if(mark[v]){ if(!rem){ if(l < B){ best=path; B=l; cerr << B << endl; } } return; } } if( g(v) > B-eps ){ return; } for(int i = 0 ; i < n ; ++i) if(!mark[i]) { rem--; mark[i]=true; path.push_back(i); l+=dist[v][i]; BnB(i); l-=dist[v][i]; path.pop_back(); mark[i]=false; rem++; } } int main() { ios::sync_with_stdio(false); cin >> n; for(int i = 0 ; i < n ; ++i){ for(int j = 0 ; j < n ; ++j){ cin >> dist[i][j]; } } rem = n; B=inf; BnB(0); cout << B << " " << (int)(best).size() << endl; for(int i = 0 ; i < (int)best.size() ; ++i) cout << best[i] << " "; cout << endl; return 0; }