哈密顿回路
#include<bits/stdc++.h> using namespace std; //状态压缩dp,二进制法,搜索法的优化 int dp[1<<20][21],n;//最多20个点,就是20位二进制 //在状态是i,末位点是j的情况下的最小值(因为状态没有顺序信息,但是其实只需要知道末尾点即可) //通过上个状态推出下个状态, int a[22][22]; int main() { while(cin>>n){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cin>>a[i][j]; } } memset(dp,0x3f, sizeof(dp)); dp[1][0]=0;//预处理第一个点 for(int i=3;i<(1<<n);i++){ //状态 for(int j=0;j<n;j++){ //末尾点 if((i>>j)&1){ //保证状态里有这个点 //上一个状态肯定是01序列去掉j的位置的,因为这次才走j,那么上个状态是固定的 //但是上个状态的末尾点不确定,枚举他 for(int k=0;k<n;k++){ //if(((i>>k)&1) && k!=i)不可,因为他无法初始化 10000,的只有一个1的情况,其实也可,因为1000只有第一个点有效其他都无意义,而第一个点初始化了。。 if(((i>>k)&1) && k!=i){ dp[i][j]=min(dp[i][j],dp[(1<<j)^i][k]+a[k][j]);//去掉j对应的1,因为肯定是1,可以异或清0 } } } } } cout<<dp[(1<<n)-1][n-1]<<endl; } return 0; }