ACAG 0x01-4 最短Hamilton路径

论为什么书上标程跑不过这道题……

首先,这道题与今年CSP-S2的D1T3有着异曲同工之妙,那就是——都有$O(n!)$的做法!(大雾)

这道题的正解是状压DP。

对于任意时刻,我们可以使用一个$n$位二进制数,若其第$i$位为$1$,则表示第$i$个点已经被经过,反之未被经过。因此我们可以使用$f[i][j]$表示状态为二进制数$i$,目前处于点$j$时的最短路径。

在起点时,有$f[1][0]=0$,即只经过了点$0$,而相应的状态就是只有最低位为$1$。

记得要把$f$数组的其他值均初始化为$INF$。

不难得到,我们要的最终结果是$f[(1<<n)-1][n-1]$,即经过所有点($i$的每一位都是$1$),处于终点$n-1$的最短路。

而本题的状态转移方程为:

$f[i][j]=min(f[i][j],f[i^(1<<j)][k]+dis[j][k])$ 当且仅当$(i>>j)&1=1$且$(i>>k)&1=1$

其中,因为$j$只能被恰好经过一次,且$k$也被恰好经过一次,所以考虑所有这样的$k$取最小值即可。

#include<bits/stdc++.h>
#define N 20 using namespace std; int n;
int dis[N][N],f[1<<N][N]; void Read() {
scanf("%d",&n);
for(int i=0;i<=n-1;i++) {
for(int j=0;j<=n-1;j++) {
scanf("%d",&dis[i][j]);
}
}
return;
} void Solve() {
memset(f,0x3f,sizeof(f));
f[1][0]=0;
for(int i=1;i<=(1<<n)-1;i++) {
for(int j=0;j<=n-1;j++) {
if((i>>j)&1) {
for(int k=0;k<=n-1;k++) {
if((i>>k)&1) {
f[i][j]=min(f[i][j],f[i^(1<<j)][k]+dis[j][k]);
}
}
}
}
}
printf("%d",f[(1<<n)-1][n-1]);
return;
} int main()
{
Read();
Solve();
return 0;
}

ACAG 0x01-4 最短Hamilton路径的更多相关文章

  1. 『最短Hamilton路径 状态压缩DP』

    状压DP入门 最短Hamilton路径 Description 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamil ...

  2. 最短Hamilton路径【状压DP】

    给定一张 nn 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次. 输入 ...

  3. 位运算 - 最短Hamilton路径

    给定一张 n 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次. 输入格 ...

  4. 0103 最短Hamilton路径【状压DP】

    0103 最短Hamilton路径 0x00「基本算法」例题 描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Ham ...

  5. 最短Hamilton路径

    题目描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每 ...

  6. 最短Hamilton路径-状压dp解法

    最短Hamilton路径 时间限制: 2 Sec  内存限制: 128 MB 题目描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamil ...

  7. AcWing 91. 最短Hamilton路径

    今天第一次在\(AcWing\)这个网站上做题,来发一下此网站的第一篇题解 传送门 思路 直接枚举的话时间复杂度为\(O(n*n!)\) 复杂度显然爆炸,所以我们用二进制枚举,这样就可以把复杂度降到\ ...

  8. # 最短Hamilton路径(二进制状态压缩)

    最短Hamilton路径(二进制状态压缩) 题目描述:n个点的带权无向图,从0-n-1,求从起点0到终点n-1的最短Hamilton路径(Hamilton路径:从0-n-1不重不漏的每个点恰好进过一次 ...

  9. 最短Hamilton路径 数位dp

    最短Hamilton路径 #include<bits/stdc++.h> using namespace std; ; <<maxn][maxn]; int maps[maxn ...

随机推荐

  1. Linux whereis、find和locate命令区别以及应用场景

    查找某个文件是我们在使用使用linux中非常常用的一个命令. linux中有多个查找文件的指令:whereis.find.locate都有类似查找的功能,下面将讲解这些指令之间的区别. whereis ...

  2. TensorFlow 8 bit模型量化

    本文基本参考自这篇文章:8-Bit Quantization and TensorFlow Lite: Speeding up mobile inference with low precision ...

  3. Zabbix使用第三方API短信报警

    之前试过邮件告警,微信告警.但是,对于一些企业的重要业务服务器,可能是存放在隔离的内网中的,无法正常连接外网.这个时候,就有必要考虑一下使用短信告警.以下这个其实还是需要服务器能够连接到外网的,但是我 ...

  4. Elasticsearch在windows上安装与使用

    Elasticsearch简称ES. 是一个全文搜索服务器,也可作为NoSQL数据库,存储任意格式的文档和数据,也可做大数据的分析,是一个跨界开源产品. ES的特点: 全文搜索引擎 文档存储和查询 大 ...

  5. docker搭建samba共享目录

    需求:因同事需要共享文件夹来传输数据.整好接触docker,所以想用docker来搭建samber 系统:Centos7.4 docker搭建就不在赘述,如有需要请参考:https://www.jia ...

  6. 【miscellaneous】编码格式简介(ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE)

    转发:http://blog.jobbole.com/30526/ 来源:潜行者m 的博客 编码一直是让新手头疼的问题,特别是 GBK.GB2312.UTF-8 这三个比较常见的网页编码的区别,更是让 ...

  7. sizeof(类名字)

    析构函数,跟构造函数这些成员函数,是跟sizeof无关的,因为我们的sizeof是针对实例,而普通成员函数,是针对类体的,一个类的成员函数,多个实例也共用相同的函数指针,所以自然不能归为实例的大小. ...

  8. [转帖]sql server版本特性简介、版本介绍简介

    sql server版本特性简介.版本介绍简介 https://www.cnblogs.com/gered/p/10986240.html 目录 1.1.sql server的版本信息 1.2.版本重 ...

  9. 彻底理解Runnable和Thread的区别

    昨天去面试,面试官问了一个问题:Runnable和Thread有什么区别,因为针对这个问题以前有背过,并且网上大多数都是这些结论,所以脱口而出: 1.Thread有单继承的问题: 2.Runnable ...

  10. lambd

    匿名函数 1.匿名函数格式 void test01() { []() { cout << "hello world" << endl; }(); } 2使用 ...