zoukankan      html  css  js  c++  java
  • 状压 dp

    最短哈密尔顿路径

    P4802 [CCO 2015]路短最

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    int n, m, w[19][19], f[1 << 19][19];
    int main(){
        scanf("%d %d", &n, &m);
        for (int i = 1, s, d, l; i <= m; ++i) {
            scanf("%d %d %d", &s, &d, &l);
            w[s][d] = l;
        }
        memset(f, 0x8f, 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 && w[k][j])// 边要存在
                           f[i][j] = max(f[i][j], f[i ^ 1 << j][k] + w[k][j]); 
        int ans = 0;
        for (int i = 1; i < 1 << n; ++i) ans = max(ans, f[i][n - 1]);
        // 不一定要把 n 个城市都走完 所以要在所有以 n - 1 为最后一个点的状态里得出答案
        // 枚举所有的 s , 找到所有情况保证正确性
        printf("%d
    ", ans);
        return 0;
    }
    
  • 相关阅读:
    redis哨兵高可用
    数据库主从搭建
    docker 补充
    docker 进阶操作
    docker 简介
    数据可视化(Matplotlib)
    数据操作
    pandas练习
    Pandas简介
    python mysql utf-8 latin
  • 原文地址:https://www.cnblogs.com/Niuwadiandian/p/15407197.html
Copyright © 2011-2022 走看看