AcWing91.最短 Hamilton 路径

题目

给定一张 n n n 个点的带权无向图,点从 0∼ n − 1 n−1 n1 标号,求起点 0 到终点 n − 1 n−1 n1 的最短 Hamilton 路径。

Hamilton 路径的定义是从 0 到 n − 1 n−1 n1 不重不漏地经过每个点恰好一次。

输入格式

第一行输入整数 n n n

接下来 n n n 行每行 n n n 个整数,其中第 i i i 行第 j j j 个整数表示点 i i i j j j 的距离(记为 a [ i , j ] a[i,j] a[i,j])。

对于任意的 x , y , z x,y,z x,y,z,数据保证 a [ x , x ] = 0 , a [ x , y ] = a [ y , x ] a[x,x]=0,a[x,y]=a[y,x] a[x,x]=0a[x,y]=a[y,x] 并且 a [ x , y ] + a [ y , z ] ≥ a [ x , z ] a[x,y]+a[y,z]≥a[x,z] a[x,y]+a[y,z]a[x,z]

输出格式

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

数据范围

  • 1 ≤ n ≤ 20 1≤n≤20 1n20
  • 0 ≤ a [ i , j ] ≤ 1 0 7 0≤a[i,j]≤10^7 0a[i,j]107

输入样例

5
0 2 4 5 1
2 0 6 5 3
4 6 0 8 3
5 5 8 0 5
1 3 3 5 0

输出样例

18

分析

很容易想到本题的一种 “朴素” 做法,就是枚举 n n n 个点的全排列,计算路径长度取最小值,时间复杂度为 O ( n ∗ n ! ) O(n * n!) O(nn!),使用下面的二进制状态压缩 DP 可以优化到 O ( n 2 ∗ 2 n ) O(n^2 * 2^n) O(n22n)

在任意时刻如何表示哪些点已经被经过,哪些点没有被经过?可以使用一个 n n n 位二进制数,若其第 i i i 位( 0 ≤ i < n 0 \le i \lt n 0i<n) 为 1,则表示第 i i i 个点已经被经过,反之未被经过。

在任意时刻还需要知道当前所处的位置,因此可以使用 F [ i , j ] ( 0 ≤ i < 2 n , 0 ≤ j < n ) F[i,j](0 \le i \lt 2^n, 0 \le j \lt n) F[i,j]0i<2n,0j<n 表示 “点被经过的状态” 对应的二进制数为 i i i,且目前处于点 j j j 时的最短路径。

在起点时,有 F [ 1 , 0 ] = 0 F[1,0] = 0 F[1,0]=0,即只经过了点 0( i i i 只有第 0 位为 1),目前处于起点 0,最短路径长度为 0。为了方便起见, F F F 数组其他的值设为无穷大目标是 F[(1 << N) - 1, n - 1],即经过所有点 ( i i i 的所有位都是 1),处于终点 n − 1 n - 1 n1 的最短路。

在任意时刻,有公式 F[i,j] = min{F[i ^ (1 << j), k] + weight(k,j)},其中 0 ≤ k < n 0 \le k \lt n 0k<n 并且 ((i >> j) & 1) = 1,即当前时刻 “被经过的点的状态” 对应的二进制数为 i i i,处于点 j j j。因为 j j j 只能被恰好经过一次,所以一定是刚刚经过的,故在上一时刻 “被经过的点的状态” 对应的二进制数的第 j j j 位应该赋值为 0,也就是 i ^ (1 << j)。另外,上一时刻所处的位置可能是i ^ (1 << j) 中任意一个是 1 的数位 k k k,从 k k k 走到 j j j 需经过 weight(k,j) 路程,可以考虑所有这样的 k k k 取最小值。这就是以上公式的由来。

代码

#include <iostream>
#include <cstring>
using namespace std;const int N = 1 << 20;
int F[N][20]; //F[i][j]表示被经过的点的状态为i,目前处于点j的最短路径
int weight[20][20];int hamilton(int n) {memset(F, 0x3f, sizeof(F));F[1][0] = 0;for (int i = 1; i < 1 << n; i++) {for (int j = 0; j < n; j++) {if ((i >> j) & 1) { //第j位为1for (int k = 0; k < n; k++) {if ((i ^ (1 << j)) >> k & 1) { //当前在k点,要去j点F[i][j] = min(F[i][j], F[i ^ (1 << j)][k] + weight[k][j]);}}}}}return F[(1 << n) - 1][n - 1];
}int main() {int n;cin >> n;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {cin >> weight[i][j];}}cout << hamilton(n) << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/156919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB算法实战应用案例精讲-【目标检测】机器视觉-工业相机

目录 前言 算法原理 机器视觉系统设计 照明设计 光学成像系统与相机

git常常用命令

这篇文章中&#xff0c;一些简单的&#xff0c;大家都知道的git 命令我就不再赘述&#xff0c;我只写出来最近在项目中常用到的一些命令。这些命令可以帮助我更好的开发。 git stash 请大家设想下面的场景&#xff0c;你的本地有两个分支&#xff0c;develop,fix分支&#xf…

CentOS基Docker容器时区配置解决方案

配置Docker容器的时区对于确保应用程序正确处理日期和时间至关重要。当使用CentOS作为基础镜像时&#xff0c;可以通过以下两种方法配置时区&#xff1a; 方法一&#xff1a;在Dockerfile中设置时区 这种方法涉及在构建Docker镜像的过程中设置时区。 步骤 选择基础镜像&…

ModuleNotFoundError: No module named ‘unstructured‘

使用pip install unstructured下载不下来 把unstructured的whl文件下载到本地安装也没成功&#xff0c;把punkt加载到nltk&#xff0c;这种方法也没成功 import nltk nltk.download(punkt) python版本当时是3.9.12&#xff0c;不知道是里面哪个包有冲突&#xff0c;时间有限…

禁止linux shell 终端显示完整工作路径,如何让linux bash终端不显示当前工作路径

在操作linux时&#xff0c;默认安装的linux终端会显示当前完整的工作目录&#xff0c;如果目录比较短还是可以接收&#xff0c;如果目录比较长&#xff0c;就显得比较别扭&#xff0c;操作起来不方便&#xff0c;因此需要关闭这种功能。 要关闭这个功能&#xff0c;请按如下步骤…

【书籍篇】Git 学习指南(二)提交与多次提交

Git 学习指南&#xff08;二&#xff09;提交与多次提交 三. 提交3.1 访问权限与时间戳3.2 add与commit3.3 再谈提交散列值3.4 提交历史3.5 略有不同的提交查看方法3.6 同一项目的多部不同历史 四. 多次提交4.1 status命令4.1.1 选择性修改 4.2 存储在暂存区中的快照4.3 怎样的…

智能座舱架构与芯片- (11) 软件篇 上

一、智能汽车基础软件平台分类 汽车软件主要分为应用软件和基础软件。应用软件和业务形态高度关联&#xff0c;不同控制器的应用软件之间差异较大。基础软件介于应用软件和硬件之间&#xff0c;用于屏蔽硬件特性、支撑应用软件。可有效地实现应用软件与硬件之间解耦&#xff0…

ky10 server x86 安装、更新openssl3.1.4(在线编译安装、离线安装)

查看openssl版本 openssl version 离线编译安装升级 #!/bin/shOPENSSLVER3.1.4OPENSSL_Vopenssl versionecho "当前OpenSSL 版本 ${OPENSSL_V}" #------------------------------------------------ #wget https://www.openssl.org/source/openssl-3.1.4.tar.gzech…

【Python】学习Python面向对象编程的疑问

&#xff08;Java菜鸟来学Python了&#xff09; &#x1f914; 1. 静态方法与类方法什么区别&#xff1f; 实例方法只能被实例对象调用(Python3 中&#xff0c;如果类调用实例方法&#xff0c;需要显示的传self, 也就是实例对象自己)&#xff0c;静态方法(由staticmethod装饰…

LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型

根据图片生成推广文案&#xff0c; 用的HuggingFace中的image-caption模型 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数…

STM32 寄存器配置笔记——系统时钟配置 HSE as PLL

一、概述 本文主要介绍使用HSE高速外部时钟通过PLL倍频输出72MHZ的时钟作为系统时钟。下图为时钟树。 使用正点原子的开发板调试OSC_IN、OSC_OUT接的是8MHZ的晶振即为HSE时钟。 二、配置流程 1&#xff09;复位RCC相关的所有寄存器 复位内容是参考正点原子例程&#xff0c;按照…

云计算:开辟数字时代的无限可能

云计算是一项革命性的技术&#xff0c;为企业和个人提供了灵活、可扩展和高效的计算资源。本文将介绍云计算的概念、架构和优势&#xff0c;并探讨其在数字化时代的重要性和未来发展趋势。 引言 随着信息技术的日新月异和数字化转型的浪潮席卷全球&#xff0c;云计算作为一种颠…

深入Tailwind CSS中的文本样式

深入Tailwind CSS中的文本样式 样式文本是网页设计的一个基本组成部分&#xff0c;而 Tailwind CSS 提供了范围广泛的实用类&#xff0c;使文本样式设计既高效又有效。 在本本中&#xff0c;我们将探索文本样式的常见最佳实践,讨论潜在的陷阱&#xff0c;并推荐设计方法。我们…

多元函数奇偶性

多元函数奇偶性 多元函数的定义域 定义域根据函数的变量数不同,有不同的形式 一元函数 y f ( x ) yf(x) yf(x),定义域可以是数集二元函数 z f ( x , y ) zf(x,y) zf(x,y),定义域可以是一平面区域,是平面点集三元函数 v f ( x , y , z ) vf(x,y,z) vf(x,y,z),定义域是一块空…

ZYNQ_project:lcd_pic_400x400

在lcd液晶屏上显示400x400像素的图片&#xff0c; 像素信息通过电脑的串口调试助手&#xff0c;发送给fpga&#xff0c;存储在例化的双端口ram中&#xff0c; 在要显示图像区域&#xff0c;读取ram中的像素信息。 模块框图&#xff1a; 时序图&#xff1a; 代码&#xff1a;…

O-Star|再相识

暑去秋来&#xff0c;岁月如梭&#xff0c;几名"O-Star"们已经入职一段时间&#xff0c;在这期间他们褪去青涩&#xff0c;逐渐适应了公司的工作环境和文化&#xff0c;迈向沉稳&#xff5e; 为了进一步加深校招生之间的交流与了解&#xff0c;提高校招生的凝聚力和…

gitlab

Gitlab 安装git yum安装 [rootgit ~]# yum -y install git编译安装 Git官网 #安装依赖关系 [rootgit ~]# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel autoconf gcc perl-ExtUtils-MakeMaker # 编译安装 [rootgit ~]# tar -zxf git-2.0…

基于 Eureka 的 Ribbon 负载均衡实现原理【SpringCloud 源码分析】

目录 一、前言 二、源码分析 三、负载均衡策略 一、前言 如下图&#xff0c;我们在 orderserver 中通过 restTemplate 向 usersever 发起 http 请求&#xff0c;在服务拉取的时候&#xff0c;主机名 localhost 是用服务名 userserver 代替的&#xff0c;那么该 url 是一个可…

Java动态代理JKD版本

1、ISale.java package com.atguigu; public interface ISale {void saleShaoBing();void saleJianBing();void saleYueBing();void saleManTou(); }2、WuDa.java package com.atguigu;//Target:目标类、目标对象 public class WuDa implements ISale{//target method:目标方法…