Hamilton路径(模板题)

image


运用二进制状态压缩,模板题

  •   1 #include <iostream>
      2 #include <algorithm>
      3 #include <cstring>
      4 using namespace std;
      5 
      6 int f[1 << 20][20], weight[20][20], n;//f[i][j]表示的时状态为i的集合,j 表示在这个状态下的位于的位置,f[i][j]表示的最小的值
      7 int hamilton(){
      8     memset(f, 0x3f, sizeof f);
      9     f[1][0] = 0;
     10     for(int i = 1; i < 1 << n; ++ i)//枚举状态,也就是几个点的集合,
     11         for(int j = 0; j < n; ++ j) if(i >> j & 1)//如果这个点是1那么,状态是成立的
     12         for(int k = 0; k < n; ++ k) if(i >> k & 1)
     13         f[i][j] = min(f[i][j], f[i^1<<j][k] + weight[k][j]); // i^1<<j上一个状态转移过来的结果
     14     return f[(1<<n)-1][n-1];
     15 }
     16 int main(){
     17 
     18 
     19     for(int i = 0; i < n; ++ i)
     20         for(int j = 0,a; j < n; ++ j)
     21             cin >> weight[i][j];
     22     cout << hamilton() << endl;
     23     return 0;
     24 }
追求吾之所爱
原文地址:https://www.cnblogs.com/rstz/p/14391047.html