weinan030416

导航

回路计数

题目描述

蓝桥学院由 2121​​​ 栋教学楼组成,教学楼编号 11​​ 到 2121​​。对于两栋教学楼 a​​ 和 b​,当 a​ 和 b​ 互质时,a 和 b 之间有一条走廊直接相连,两个方向皆可通行,否则没有直接连接的走廊。

小蓝现在在第一栋教学楼,他想要访问每栋教学楼正好一次,最终回到第一栋教学楼(即走一条哈密尔顿回路),请问他有多少种不同的访问方案?

两个访问方案不同是指存在某个 i,小蓝在两个访问方法中访问完教学楼 i 后访问了不同的教学楼。

//881012367360
#include <bits/stdc++.h>
#define int long long
using namespace std;
int dp[1 << 22][22] , g[22][22];
signed main()
{
    int n = 1 << 21;
    for(int i = 1 ; i <= 21 ; i ++) for(int j = 1 ; j <= 21 ; j ++){
        if(__gcd(i , j) == 1) g[i - 1][j - 1] = g[j - 1][i - 1] = 1;
    }
    dp[1][0] = 1;
    for(int i = 1 ; i < n ; i ++){
        for(int j = 0 ; j < 21 ; j ++){
            if(!(i >> j & 1)) continue ;
            for(int k = 0 ; k < 21 ; k ++) {
                if(!g[j][k] || (i >> k & 1)) continue ;
                dp[i + (1 << k)][k] += dp[i][j];
            }
        }
    }
    int res = 0;
    for(int i = 0 ; i < 21 ; i ++) {
        res += dp[n - 1][i];
    }
    cout << res << '\n';
    return 0;
}

 

posted on 2023-02-12 15:30  楠030416  阅读(17)  评论(0编辑  收藏  举报