3 条题解

  • 1
    @ 2025-10-8 21:37:15
    
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int N = 20;
    const int INF = 0x3f3f3f3f;
    int f[1<<N][N], weight[N][N];
    
    int main() {
        int n;
        cin >> n;
        for(int i = 0; i < n; i++)
            for(int j = 0; j < n; j++)
                cin >> weight[i][j];
        
        memset(f, 0x3f, sizeof(f));
        f[1][0] = 0; // 初始状态:只访问过0号点
        
        for(int mask = 0; mask < (1<<n); mask++) {
            for(int j = 0; j < n; j++) {
                if((mask >> j) & 1) { // j必须在mask中
                    for(int k = 0; k < n; k++) {
                        if(!((mask >> k) & 1)) { // k不能在mask中
                            f[mask|(1<<k)][k] = min(f[mask|(1<<k)][k], f[mask][j] + weight[j][k]);
                        }
                    }
                }
            }
        }
        
        cout << f[(1<<n)-1][n-1] << endl;
        return 0;
    }
    
    
    

    信息

    ID
    4
    时间
    5000ms
    内存
    128MiB
    难度
    2
    标签
    递交数
    185
    已通过
    107
    上传者