91. 最短Hamilton路径

摘要
Title: 91. 最短Hamilton路径
Tag: 哈密顿路径、集合类状态压缩dp、dp
Memory Limit: 256 MB
Time Limit: 5000 ms

Powered by:NEFU AB-IN

Link

91. 最短Hamilton路径

  • 题意

    给定一张 n 个点的带权无向图,点从 0∼n−1 标号,求起点 0 到终点 n−1 的最短 Hamilton 路径。

  • 思路

    Hamilton 路径的定义是从 0 到 n−1 不重不漏地经过每个点恰好一次。
    img

  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    '''
    Author: NEFU AB-IN
    Date: 2022-03-13 19:45:52
    FilePath: \ACM\Acwing\91.py
    LastEditTime: 2022-03-13 20:07:57
    '''
    N = 20 #必须尽可能地小,不然M是以指数性增加得,稍微不慎就会溢出
    M = 1 << N
    INF = int(2e9)
    w = [[0] * N for _ in range(N)]
    dp = [[INF] * N for _ in range(M)]

    n = int(input())
    for i in range(n):
    w[i] = list(map(int, input().split()))

    dp[1][0] = 0 # 从0走到0,路径中只有0处为1
    for i in range(1 << n): #所有可能得路径
    for j in range(n):
    if i >> j & 1: # 挑选出终点
    pre = i - (1 << j) # 优化:预先处理出 除去j点的状态
    for k in range(n): #枚举倒数第二个点
    if (pre >> k & 1): #i除去j这个点后要包含k,才能保证k转移到j
    dp[i][j] = min(dp[i][j], dp[pre][k] + w[k][j])

    print(dp[(1 << n) - 1][n - 1]) #最后结果为 全是1,且终点为n-1
使用搜索:谷歌必应百度