リンク:
https://www.acwing.com/problem/content/93/
質問の意味:
点0〜n-1の符号からn点の加重無向グラフが与えられると、エンドポイントの開始点のn-1 0ハミルトン最短経路を見つけるために。ハミルトン経路が正確に一度各点に貫通漏れない0からN-1に定義されています。
アイデア:
バイナリ列挙した後である点。列挙点jを通過しながら、点JとKの前にポイントを介して列挙する。
Dpとを[I] [J] =与えるために分(DP [I] [j]を、Dpを[ lasti] [K] +レン[ K] [J])。 iは点j、圧縮値の経過時間にlasti点jの後、圧縮値に対応します。
コード:
#include <bits/stdc++.h>
using namespace std;
int F[1<<20][30];
int Map[30][30];
int n;
int main()
{
scanf("%d", &n);
for (int i = 0;i < n;i++)
{
for (int j = 0;j < n;j++)
scanf("%d", &Map[i][j]);
}
memset(F, 0x3f3f, sizeof(F));
F[1][0] = 0;
for (int i = 1;i < (1<<n);i++)
{
for (int j = 0;j < n;j++)
{
if ((i >> j) & 1)
{
for (int k = 0;k < n;k++)
{
if ((i ^ (1<<j)) >> k & 1)
F[i][j] = min(F[i][j], F[i^(1<<j)][k]+Map[k][j]);
}
}
}
}
printf("%d\n", F[(1<<n)-1][n-1]);
return 0;
}