zoukankan      html  css  js  c++  java
  • 哈密顿回路

    #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;
    }
  • 相关阅读:
    hdu2302(枚举,大数取模)
    hdu2108(判断凸多边形)
    Codeforces Round #324 (Div. 2) C (二分)
    hdu1798(圆的位置关系)
    hdu1722(gcd)
    alias命令(使用命令别名)
    关于Linux环境变量
    poj1988(并查集)
    Linux基本命令
    Pandas数据规整
  • 原文地址:https://www.cnblogs.com/MorrowWind/p/13056345.html
Copyright © 2011-2022 走看看