这是一道典型的状压题~~(虽然不开O2最后一个点要T掉)~~
废话不多说,直接上代码:
```cpp
#include <bits/stdc++.h>
#define inf 0x7f7f7f7f
const int maxn = 25;
const int maxm = 1100010;
int n, ans = inf;
int dp[maxm][maxn], map[maxn][maxn];
int main()
{
scanf("%d", &n);
for (register int i = 1; i <= n; i ++)
for (register int j = 1; j <= n; j ++)
scanf("%d", &map[i][j]);
memset(dp, 0x7f, sizeof dp);
dp[1][1] = 0;
for (register int i = 0; i < (1 << n); i ++)
for (register int j = 1; j <= n; j ++)
if (!(i & (1 << (j - 1))))
for (register int k = 1; k <= n; k ++)
if (i & (1 << (k - 1)))
dp[i | (1 << (j - 1))][j] = std::min(dp[i | (1 << (j - 1))][j], dp[i][k] + map[k][j]);
for (register int i = 2; i <= n; i ++)
ans = std::min(ans, dp[(1 << n) - 1][i] + map[i][1]);
printf("%d\n", ans);
return 0;
}
```