复习位运算

最短Hamilton路径

https://ac.nowcoder.com/acm/problem/50909

for(int i = 1;i<1<<20;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)
                    {
                        f[i][j] = min(f[i][j],f[i^(1<<j)][k]+w[k][j]);
                        现在的状态是一定经过了j,因为每个点只能经过一次 所以 j 是刚经过的,我们来看到达这个点是不是有其他的 k 点更近 
                    }
                }
            }
        }
    }
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <stack>
#include <set>
#include <cmath>
#define  pb push_back
typedef long long ll;
using namespace std;
int w[20+5][20+5];
int f[1<<20][20];
int n ;
void work()
{
    memset(f,0x3f,sizeof f);
    f[1][0] = 0;
    //cout << f[1][2];
    for(int i = 1;i<1<<20;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)
                    {
                        f[i][j] = min(f[i][j],f[i^(1<<j)][k]+w[k][j]);
                    }
                }
            }
        }
    }
    cout << f[(1<<n) -1 ][ n -1];
}
int main()
{
  //  cout << 0x3f << endl;
   //freopen("in.txt","r",stdin);
    cin >> n;
    for(int i = 0 ;i < n ;i ++){
        for(int j = 0 ;j < n ;j++)
            scanf("%d",&w[i][j]);
    }
    work();
    return 0 ;
}
全部评论

相关推荐

Hello_WordN:咱就是说,除了生命其他都是小事,希望面试官平安,希望各位平时也多注意安全
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 17:16
科大讯飞 算法工程师 28.0k*14.0, 百分之三十是绩效,惯例只发0.9
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务