zoukankan      html  css  js  c++  java
  • 最短Hamilton路径

     

     这道题目之前做过https://www.cnblogs.com/fx1998/p/13246173.html

    现在复习之前的代码,明显更加轻松了

    这就是二进制状态压缩

    对状态转移方程新的理解:

     时间复杂度2  ^ 20 * 20

    需要注意的就是位运算操作与加减操作的优先级问题

    下面代码的27行我错写成了cout << dp[1 << n - 1][n - 1] << endl;

    然后因为优先度问题错了

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N = 21, M = (1 << N);
     4 int w[N][N]; //两点之间的距离
     5 int dp[M][N];
     6 int main() {
     7     int n;
     8     cin >> n;
     9     for (int i = 0; i < n; i++) {
    10         for (int j = 0; j < n; j++) {
    11             cin >> w[i][j];
    12         }
    13     }
    14     memset(dp, 0x3f, sizeof dp); //求最小值要初始化为一个较大值
    15     dp[1][0] = 0; //边界值
    16     for (int i = 0; i < (1 << n); i++) { //所有状态
    17         for (int j = 0; j < n; j++) { //所有点
    18             if (i >> j & 1) {
    19                 for (int k = 0; k < n; k++) { //枚举下从哪个点转移过来
    20                     if (i - (1 << j) >> k & 1) { //从k点转移过来
    21                         dp[i][j] = min(dp[i][j], dp[i - (1 << j)][k] + w[k][j]);
    22                     }
    23                 }
    24             }
    25         }
    26     }
    27     cout << dp[(1 << n) - 1][n - 1] << endl;
    28     return 0;
    29 }
  • 相关阅读:
    Android安装apk
    Android获取应用程序版本信息
    Handler消息传递机制
    Activity的启动模式
    cocopods的使用
    ios9 的新特性
    静态库的制作详解
    真机调试
    时间差计算(给定两时间,转换为时间差)
    socket 通信机制的实现
  • 原文地址:https://www.cnblogs.com/fx1998/p/13887317.html
Copyright © 2011-2022 走看看