Acwing-91-ハミルトン最短経路(DP圧力等)

リンク:

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;
}

おすすめ

転載: www.cnblogs.com/YDDDD/p/11456367.html