#

# 1. 基本概念

# 2. 表示方法

# 3. 问题类别

# 联通分量

#

# 最短路径

# A-B的最短路径
# 走遍前部节点最短路径

无权无向图 广度搜索: 状态(i, mask, dist) 表示 当前节点i,走过的mask,所走过的距离

初始时,每个位置都放入队列

mask = 1 << n - 1 时候已经全部走完

为了避免重复,使用visit[i][mask]记录是否走过,防止重复入队

时间复杂度: O(n^2 * 2^n) : 广度搜索的基础上增加了节点的mask 空间复杂度: O(n * 2^n)

dp: 对于任意一条经过所有节点的路径,它的某一个子序列(可以不连续)一定是 0,1,⋯,n−1 的一个排列。我们称这个子序列上的节点为「关键节点」

状态定义:用 f[u][mask] 表示从任一节点开始到节点 u 为止,并且经过的「关键节点」对应的二进制表示为 mask 时的最短路径长度。

状态转移:f[u][mask] = min{f[v][mask\u]+d(v,u)}

结果: min{f[i][(1<<n)-1]}

# 走遍节点