zoukankan      html  css  js  c++  java
  • Acwing-91-最短Hamilton路径(状压DP)

    链接:

    https://www.acwing.com/problem/content/93/

    题意:

    给定一张 n 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径。 Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次。

    思路:

    用二进制枚举哪些点被经过了.同时枚举经过的点j,再枚举经过点j之前的点k.
    得到Dp[i][j] = min(Dp[i][j], Dp[lasti][k]+Len[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
    ", F[(1<<n)-1][n-1]);
    
        return 0;
    }
    
  • 相关阅读:
    对于作用域和闭包的理解
    响应式开发学习(3)——图片优化
    响应式开发(2)
    响应式开发(1)
    数据结构
    进阶题目
    集合
    数组
    内存相关
    线程
  • 原文地址:https://www.cnblogs.com/YDDDD/p/11456367.html
Copyright © 2011-2022 走看看