#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
int f[1 << 20][20]; //f[i][j]表示i的状态,为1则代表经过,为0则代表没经过。j代表当前所处的位置。
int weight[20][20]; //存储边的权值
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
cin >> weight[i][j];
memset(f, 0x3f, sizeof f);
f[1][0] = 0; //起点为0,i为1代表经过0这个起点,j为0代表当前在0这个位置
for(int i = 0; i < 1 << n; i++)
for(int j = 0 ; j < n; j++)
if(i >> j & 1){ //如果经过了第j位,则与上一状态比较,寻找最小值
for(int k = 0; k < n; k++)
if(i - (1 << j) >> k & 1)//表示上一状态没有经过第j位,经过了第k位的情况
f[i][j] = min(f[i][j],f[i - (1 << j)][k] + weight[k][j]);}//取最小值
cout << f[(1 << n) - 1][n - 1] << endl;
return 0;
}
最短Hamilton路径
最新推荐文章于 2022-10-23 23:52:46 发布