<更新提示>

<第一次更新>状压DP入门


<正文>

最短Hamilton路径

Description

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

Input Format

第一行一个整数n。 接下来n行每行n个整数,其中第i行第j个整数表示点i到j的距离(一个不超过10^7的正整数,记为a[i,j])。 对于任意的x,y,z,数据保证 a[x,x]=0,a[x,y]=a[y,x] 并且 a[x,y]+a[y,z]>=a[x,z]。

Output Format

一个整数,表示最短Hamilton路径的长度。

Sample Input

4
0 2 1 3
2 0 2 1
1 2 0 1
3 1 1 0

Sample Output

4

解析

很容易想到的朴素解法是枚举全排列,时间复杂度\(O(n*!n)\),显然是会\(TLE\)的。注意到\(n<20\),我们考虑状态压缩\(DP\)。设\(f[i][S]\)代表当前遍历状态为\(S\),到了第\(i\)个点的最短长度。如何理解遍历状态\(S\)呢?我们把它当做一个二进制的\(01\)串,从右数第i位为如果为\(0\),就说明节点i没有被遍历到过,如果第\(i\)位为\(1\),则说明节点i被遍历到过了。我们将整个图的遍历状态记为一个二进制数,这就是状态压缩。

那么我们考虑如何\(DP\)。我们将编号记为从\(1\)开始的,那么初始状态就是\(f[1][1]=0\)。

这里我们需要先理解状态的查询和赋值操作:

1.S&(1<<(i-1))代表取出状态S的(从右往左)第i位

2.S|(1<<(i-1))代表将状态S的(从右往左)第i位赋值为1

那么我们就可以得到状态转移方程了:$$f[j][S|(1<<(j-1))]=\min{f[i][S]+dis[i][j]}$$

需要满足节点\(j\)未访问,节点\(i\)已经访问过了。

状态的初值一开始均为正无穷,枚举\(S,i,j\)即可转移,时间复杂度\(O(n^2*2^n)\),目标状态为\(f[n][(1<<n)-1]\)。

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
const int N=20;
int n,dis[N+5][N+5],f[N+5][(1<<N)+5],ans=0x3f3f3f3f;
inline void input(void)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&dis[i][j]);
}
inline void dp(void)
{
memset(f,0x3f,sizeof f);
f[1][1]=0;
for(int S=1;S<(1<<n);S++)
for(int i=1;i<=n;i++)
if(S&(1<<(i-1)))
for(int j=1;j<=n;j++)
if( not (S&(1<<(j-1))) )
f[j][S|(1<<(j-1))]=min(f[j][S|(1<<(j-1))],f[i][S]+dis[i][j]); }
int main(void)
{
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
input();
dp();
printf("%d\n",f[n][(1<<n)-1]);
}

<后记>

『最短Hamilton路径 状态压缩DP』的更多相关文章

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

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

  2. 完全图的最短Hamilton路径——状压dp

    题意:给出一张含有n(n<20)个点的完全图,求从0号节点到第n-1号节点的最短Hamilton路径.Hamilton路径是指不重不漏地经过每一个点的路径. 算法进阶上的一道状压例题,复杂度为O ...

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

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

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

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

  5. 最短Hamilton路径(状压dp)

    最短Hamilton路径实际上就是状压dp,而且这是一道作为一个初学状压dp的我应该必做的题目 题目描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 ...

  6. Light OJ 1406 Assassin`s Creed 状态压缩DP+强连通缩点+最小路径覆盖

    题目来源:Light OJ 1406 Assassin`s Creed 题意:有向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问题 ...

  7. 最短Hamilton路径 数位dp

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

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

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

  9. POJ 3311 Hie with the Pie(Floyd+状态压缩DP)

    题是看了这位的博客之后理解的,只不过我是又加了点简单的注释. 链接:http://blog.csdn.net/chinaczy/article/details/5890768 我还加了一些注释代码,对 ...

随机推荐

  1. SpringCloud入门

    一. 什么是 SpringCloud           什么是 SpringCloud:是一个服务治理平台,提供了一些服务框架.包含了:服务注册与发现.配置中心.消息中心 .负载均衡.数据监控等等. ...

  2. 业务线B/C端业务组件总结

    /** * 业务线组件总结 * */ /* B端组件的总结 1.组件cssBase的总结 1像素底部边框 */ @mixin border - 1px - b($background: $gray - ...

  3. Python + Anaconda + vscode环境重装(2019.4.20)

    目录 卸载程序 安装Ananconda 检查系统环境变量 更换国内镜像源 设置VS CODE 用户配置及工作环境配置 @(Python + Anaconda + vscode环境重装) 工程目录的使用 ...

  4. anaconda 命令集合

    0.安装 $ bash ~/Downloads/Anaconda3-5.3.1-MacOSX-x86_64.sh source ~/.bash_profile 1.查看 anaconda 的版本 co ...

  5. arp断网攻击

    arp断网攻击可以是同局域网内主机无法上网!(可恶搞室友哦,嘻嘻!) 实现原理 arp的中文释义是地址解析协议,全英文 address resolution protocol,是一个将局域网IP地址映 ...

  6. [LeetCode] Shifting Letters 漂移字母

    We have a string S of lowercase letters, and an integer array shifts. Call the shift of a letter, th ...

  7. js数组和对象相等判断、拷贝详解(结合几个现象讲解引用数据类型的趣事)

    序言 最近遇到几个js引用数据类型造成的bug,今天结合bug详细分析一下,避免以后再犯,也希望能帮大家提个醒,强化js基本功. 目录 1.浅拷贝.深拷贝,解决变量赋值相互影响问题 2.判断2个数组. ...

  8. (一) sublime安装和使用

    1  下载安装sublime 可以破解也可以不破解 2 html基础架子自动生成插件Emmet的安装 3 Emmet 安装失败解决 4 快捷键设置和汇总 4 其他sublime插件汇总

  9. oracle登录管理员创建数据库和表空间

    登录管理员最高权限账号 cmd输入sqlplus 回车,或者直接打开sqlplus 用户名:sys 密码:sys as sysdba 1.首先,创建(新)用户: create user usernam ...

  10. Bandwagon的配置记录(一) —— kexue上网

    写在前面 这是kexue上网的一种方法. 看文章前,先拉最底下,看一遍“写在最后”. 租个服务器 我租了个洛杉矶的服务器,系统是ubuntu16.04 x86_64 进入KiwiVM Control ...