2021省赛 E. 回路计数

摘要
Title: 2021省赛 E. 回路计数
Tag: 哈密顿路径、状压dp
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

2021省赛 E. 回路计数

  • 题意

    蓝桥学院由 21​​​ 栋教学楼组成,教学楼编号 1 到 21。对于两栋教学楼 a​​ 和 b,当 a​ 和 b​ 互质时,a 和 b之间有一条走廊直接相连,两个方向皆可通行,否则没有直接连接的走廊。
    小蓝现在在第一栋教学楼,他想要访问每栋教学楼正好一次,最终回到第一栋教学楼(即走一条哈密尔顿回路),请问他有多少种不同的访问方案?
    两个访问方案不同是指存在某个 i,小蓝在两个访问方法中访问完教学楼 i 后访问了不同的教学楼。

  • 思路

    状态压缩dp板子题,求方案数,权值就是方案数,每次加上走到k的权值即可

    由于每个数都和1互质,所以都有一条通往1的路,所以统计每个点的dp值即可
    ps:

    • 不仅需要判断去除j点后,k是否存在,还要判断j,k是否有边
  • 代码

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    '''
    Author: NEFU AB-IN
    Date: 2022-03-16 16:29:18
    FilePath: \ACM\LanQiao\2021E.py
    LastEditTime: 2022-03-16 16:48:17
    '''
    N = 21
    M = 1 << 21
    import math


    def gcd(a, b):
    return gcd(b, a % b) if b else a


    dp = [[0] * N for _ in range(M)]
    g = [[0] * N for _ in range(N)]

    for i in range(1, 22):
    for j in range(i + 1, 22):
    if gcd(i, j) == 1:
    g[i - 1][j - 1] = g[j - 1][i - 1] = 1

    dp[1][0] = 1
    for i in range(M):
    for j in range(N):
    if i >> j & 1:
    pre = i - (1 << j)
    for k in range(N):
    if g[j][k] and (pre >> k & 1):
    dp[i][j] += dp[pre][k]

    res = 0
    for i in range(1, 22):
    res += dp[M - 1][i - 1]
    print(res)
使用搜索:谷歌必应百度