题面

看到数据范围这么小,第一眼想到爆搜。

然而这样做的复杂度是 \(\mathcal{O}(n! \times n)\) 的,明显会 TLE。

于是考虑状压 DP。

我们设 \(dp_{i,j}\) 表示当前走过的集合为 \(i\),且停留在 \(j\) 号点的最短路径长度。

转移的话可以枚举一个点 \(k\),意为从 \(k\) 号点走到点 \(j\),走过的集合变成了 \(i\)。然后就有了转移方程:\(dp_{i,j}=\min\{dp_{i-2^j,k}+a_{k,j}\}\),其中 \(a_{k,j}\) 表示点 \(k\) 到点 \(j\) 的距离。

注意点的标号从 \(0\) 开始。

这里介绍一个判断 \(j\) 号点是否出现在集合 \(i\) 中的技巧:直接判断 i >> j & 1 是否为 \(\text{true}\) 即可。

#include <bits/stdc++.h>
#define DEBUG fprintf(stderr, "Passing [%s] line %d\n", __FUNCTION__, __LINE__)
#define itn int
#define gI gi using namespace std; typedef long long LL;
typedef pair <int, int> PII;
typedef pair <int, PII> PIII; inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return f * x;
} inline LL gl()
{
LL f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return f * x;
} int n, m, a[23][23], dp[(1 << 20) + 5][23]; int main()
{
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
n = gi();
for (int i = 0; i < n; i+=1)
for (int j = 0; j < n; j+=1)
a[i][j] = gi();
memset(dp, 0x3f, sizeof dp);
dp[1][0] = 0;
for (int i = 0; i < (1 << n); i+=1)
{
for (int j = 0; j < n; j+=1)
{
if (i >> j & 1) //判断集合 i 中是否含有 j
{
for (int k = 0; k < n; k+=1)
{
if ((i - (1 << j)) >> k & 1) //判断没有访问 j 之前有没有访问过 k
{
dp[i][j] = min(dp[i][j], dp[i - (1 << j)][k] + a[k][j]); //转移
}
}
}
}
}
printf("%d\n", dp[(1 << n) - 1][n - 1]);
return 0;
}

题解【AcWing91】最短Hamilton路径的更多相关文章

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

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

  2. AcWing 91. 最短Hamilton路径

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

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

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

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

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

  5. 位运算 - 最短Hamilton路径

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

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

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

  7. 最短Hamilton路径

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

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

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

  9. ACAG 0x01-4 最短Hamilton路径

    ACAG 0x01-4 最短Hamilton路径 论为什么书上标程跑不过这道题-- 首先,这道题与今年CSP-S2的D1T3有着异曲同工之妙,那就是--都有$O(n!)$的做法!(大雾) 这道题的正解 ...

  10. 最短Hamilton路径 数位dp

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

随机推荐

  1. go每日新闻--2020-02-27

    go 语言中文网(每日资讯)_2020-02-27 一.Go 语言中文网 如何正确看待 Google 宣布 Fuchsia 操作系统没有选 Go 作为终端开发语言 Actor 还是 CSP?Go 中的 ...

  2. TChart-图表的滚动与翻译

    界面代码: object Form1: TForm1 Left = Top = Width = Height = Caption = 'Form1' Color = clBtnFace Font.Ch ...

  3. 二次开发的Selenium Demo版本

    文件名你们自己命名就好,至于为什么要重写强制位移的函数呢,是因为Mac上Selenium不支持拖拽,只能这样做了,4个文件--------------------------------------- ...

  4. PWN之Canary学习

    Canary 参考链接:https://ctf-wiki.github.io/ctf-wiki/pwn/linux/mitigation/canary-zh/ 0x1 简介: 用于防止栈溢出被利用的一 ...

  5. 剑指offer-面试题66-构建乘积数组-发散思维

    /* 题目: 链接:https://www.nowcoder.com/questionTerminal/94a4d381a68b47b7a8bed86f2975db46 来源:牛客网 给定一个数组A[ ...

  6. 黑龙江大学图书馆抢座python

    2019.11.01 增加成功发送QQ邮件. 2019.10.31更新 晚上测试成功 ========================== 昨晚肝了一晚上,今天已经写出成品并且部署到服务器上了,代码很 ...

  7. HTML基础标签图片文本超链接列表表格介绍

    1.HTML基础标签图片常见代码形式<img src="图片路径地址" alt="属性名" title="占位符">常见的图片格 ...

  8. request.getParameterMap获取不到数据问题

    最近在做javaweb项目的过程中发现使用request.getParameterMap( )方法获取jsp页面中的表单数据的时候发现获取不到,检查了好长时间最后发现问题是在jsp页面中. reque ...

  9. 使用elementui树形控件写项目小结

    使用tree pagination serch table 实现功能 项目难点主要解析后台传递的代码,线性转树形,这儿加上一个大神的解析 https://blog.csdn.net/dandanzmc ...

  10. cf912D

    题意简述:往n*m的网格中放k条鱼,一个网格最多放一条鱼,然后用一个r*r的网随机去捞鱼,问怎么怎么放鱼能使得捞鱼的期望最大,输出这个期望 题解:肯定优先往中间放,这里k不大,因此有别的简单方法,否则 ...