#include <bits/stdc++.h>
using namespace std;
/*
题目大意:
给定n个村庄,和一个距离矩阵,问从1出发,经过所有点一次,再返回1,需要的最短路程是多少。
思路:
经典TSP问题。
*/
typedef long long ll;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const double eps = 1e-6;
const double pi = acos(-1.0);
int n;
int G[25][25];
int dp[1 << 20][20];
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
scanf("%d", &G[i][j]);
}
}
memset(dp, 0x3f, sizeof(dp));
dp[1][0] = 0;
for(int i = 1; i < (1 << n); i++)
{
if((i & 1) == 0) continue;
for(int j = 0; j < n; j++)
{
if((i & (1 << j)) == 0) continue;
for(int k = 0; k < n; k++)
{
if((i & (1 << k)) == 0)
{
dp[i | (1 << k)][k] = min(dp[i | (1 << k)][k], dp[i][j] + G[j][k]);
}
}
}
}
int ans = INF;
for(int i = 1; i < n; i++)
{
ans = min(ans, dp[(1 << n) - 1][i] + G[i][0]);
}
printf("%d\n", ans);
return 0;
}
洛谷-P1171(状压dp)
于 2022-08-16 21:34:21 首次发布