复习位运算

最短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 ;
}
全部评论

相关推荐

点赞 评论 收藏
分享
06-26 17:24
已编辑
宁波大学 Java
一口洪烧肉:哈哈哈哈哈哈哈哈哈哈哈硬要啊
点赞 评论 收藏
分享
感觉他们一点都不了解现在这个社会就业有多难,已经在牛客刷到好多篇&nbsp;延毕的帖子了,延毕就会导致已经找好的工作就没了,还得重新再找,学校和老师们是怎么想的呢????看到学生丢失工作会开心吗&nbsp;就业数据都在造假,真实的就业困难不去解决&nbsp;一个个真是好样的
从今天开始狠狠卷JV...:学生看到的是导师不放实习导致offer黄了。 导师看到的是招进来的学生吃自己补助和自己的招生名额,却没给自己升迁带来任何帮助,还要跑路。 根本利益的不一致,最主要留校的导师大概率是职场上招聘失败的,被迫留校的,什么牛鬼蛇神都会有
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务