Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <iostream>
- #include <math.h>
- #include <vector>
- #include <string>
- #include <map>
- #include <bitset>
- #include <queue>
- #include <string.h>
- #include <algorithm>
- #define sc scanf
- #define pr printf
- #define pb push_backŝ
- #define mp make_pair
- #define fr first
- #define se second
- using namespace std;
- typedef pair<int, int> pii;
- typedef pair<double, double> pdd;
- const int P = 53;
- const int MN = 1000010;
- const long long INF = (1LL<<31) - 1LL;
- const double eps = (1e-7);
- int a[25][25];
- int d[MN][25], p[MN][25];
- int n, cur;
- int rec(int mask, int last) {
- if ((mask - (1 << last)) == 0) {
- p[mask][last] = -1;
- d[mask][last] = 0;
- return 0;
- }
- if (p[mask][last] != 0) {
- return d[mask][last];
- }
- d[mask][last] = INF;
- for (int i = 0; i < n; i++) {
- if (i != last && ((mask >> i) & 1 != 0)) {
- if (d[mask][last] > rec(mask - (1 << last), i) + a[i][last]) {
- d[mask][last] = rec(mask - (1 << last), i) + a[i][last];
- p[mask][last] = i + 1;
- }
- }
- }
- return d[mask][last];
- }
- void printAns(int t, int k) {
- if (k == -1) {
- return;
- }
- k--;
- printAns(t - (1 << k), p[t][k]);
- pr("%d ", k + 1);
- }
- main()
- {
- //freopen("in.txt","r",stdin); freopen("out.txt","w",stdout);
- sc("%d", &n);
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- sc("%d", &a[i][j]);
- }
- }
- int k = 0;
- int t = (1 << n) - 1;
- for (int i = 0; i < n; i++) {
- cur = i;
- rec(t, i);
- if (d[t][i] < d[t][k]) {
- k = i;
- }
- }
- pr("%d\n", d[t][k]);
- printAns(t, k + 1);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment