# 图
# 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]}