状态压缩DP-> 最短Hamilton路径(Acwing)

题意:n个点,求从0~n-1的最短路径(经过每个点一次) n <= 20

分析:用二进制位表示经过了点的状态,枚举所有的状态

constexpr int inf = 0x3f3f3f3f;
void solve(){
    int n;
    cin >> n;

    vector<vector<int>> dist(n, vector<int> (n));
    for (auto& x : dist){
        for (auto& y : x){
            cin >> y;
        }
    }

    vector<vector<int>> dp(1 << n, vector<int> (n, inf));
    dp[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 (k != j && ((i >> k) & 1)){
                        dp[i][j] = min(dp[i][j], dp[i - (1 << j)][k] + dist[k][j]);
                    }
                }
            }
        }
    }

    cout << dp[(1 << n) - 1][n - 1] << '\n';
}
posted @ 2024-01-16 09:17  _Yxc  阅读(10)  评论(0)    收藏  举报