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. CSS选择子简明参考

    Type Selector Example h1 { } Description Selects an HTML tag/element. Universal selector Example * { ...

  2. CentOS7 初始化硬盘分区、挂载、重启自动挂载

    挂载硬盘设备到本地有一下步骤: 1.通过fdisk -l命令,查看硬盘信息 可以看到有两块磁盘/dev/vda和/dev/vdb vda是系统盘,vdb使我们新增的数据盘,在上图中其实已经挂载完成(设 ...

  3. Ubuntu下好用的pdf工具

    安装okular sudo apt-get install okular 汉化 sudo apt-get install kde-l10n-zhcn 然后打开PDF文件时,右键选择打开方式选择okul ...

  4. BJFU-218-基于链式存储结构的图书信息表的最贵图书的查找

    如果编译不通过,可以将C该为C++ #include<stdio.h> #include<stdlib.h> #define MAX 100 //创建节点 typedef st ...

  5. 选择类排序 (简单选择排序,堆排序)— c语言实现

    选择类排序包括: (1)  简单选择排序 (2)树形选择排序 (3)堆排序 简单选择排序: [算法思想]:在第 i 趟简单选择排序中,从第 i 个记录开始,通过 n - i 次关键字比较,从 n - ...

  6. (五)pdf的构成之文件体(catalog对象)

    引自:https://blog.csdn.net/steve_cui/article/details/82735039 目录(catalog): 文档目录包含对定义文档内容的其他对象的引用.它还包含声 ...

  7. Springcloud的版本依赖问题(最全,包含springCloud所有的版本)

    版权声明:本文为博主原创文章,遵循CC 4.0 BY版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_42105629/article/detai ...

  8. Scala 系列(三)—— 流程控制语句

    一.条件表达式if Scala 中的 if/else 语法结构与 Java 中的一样,唯一不同的是,Scala 中的 if 表达式是有返回值的. object ScalaApp extends App ...

  9. flickity:支持触摸滑动,响应迅速的幻灯片轮播插件

    简介:flickity 是一个支持触摸,响应迅速的幻灯片轮播插件.支持环绕滑动.自由滑动.组滑动.自动播放.延迟加载.视差滑动.图片滑动.兼容IE10+, Android 4+, Safari for ...

  10. springboot笔记10——整合Redis

    依赖 <dependencies> <!--web依赖--> <dependency> <groupId>org.springframework.boo ...