C++ 动态规划 状态压缩DP 最短Hamilton路径

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

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

输入格式
第一行输入整数 n

接下来 n
行每行 n
个整数,其中第 i
行第 j
个整数表示点 i
到 j
的距离(记为 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]

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

数据范围
1≤n≤20

0≤a[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在这里插入图片描述

代码中的 f[i][j] 表示从起点出发,经过状态 i 中的所有顶点,最后到达顶点 j 的最短路径长度。状态 i 是一个二进制数,其中的每一位表示对应顶点是否已经经过,1 表示经过,0 表示未经过。因此,状态 i 中有多少个 1,就表示已经经过了多少个顶点。

首先,我们将 f 数组初始化为正无穷,表示初始时任意两个顶点之间的距离均为无穷大。然后,我们从起点出发,经过每一个顶点一次,最后回到起点。因此,我们从状态 1 出发,即只经过起点。这时,起点到起点的距离显然为 0,所以 f[1][0] = 0。

接下来,我们遍历所有的状态 i 和顶点 j,尝试更新 f[i][j] 的值。对于状态 i 中的每一个顶点 j,我们尝试从状态 i 中移除顶点 j,得到状态 i - (1 << j),然后找到之前状态 i - (1 << j) 中的一个顶点 k,使得从 k 经过 j 到达终点 j 的路径最短。这样就可以更新状态 i 中顶点 j 的最短路径长度。具体来说,就是 f[i][j] = min(f[i][j], f[i - (1 << j)][k] + w[k][j])。

最后,我们找到从任意一个顶点出发,经过所有的顶点一次后回到起点的最短路径。因此,答案就是 f[(1 << n) - 1][n - 1],表示从状态 (1 << n) - 1(即所有顶点都经过)到达顶点 n - 1(起点)的最短路径长度。

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;const int N = 21, M = 1 << N;int n;
int w[N][N];
int f[M][N];int main ()
{scanf("%d", &n);for(int i = 0; i < n; i ++ )for(int j = 0; j < n; j ++ )scanf("%d", &w[i][j]);memset(f, 0x3f, sizeof f); // 初始化为正无穷f[1][0] = 0; // 初始化第一个点,第一维1表示只走了0号这一个点,第二维度表示从0号点(默认)走到了0号点for(int i = 0; i < 1 << n; i ++ ) for(int j = 0; j < n; j ++ )if(i >> j & 1) // 从0走到j,则i里面一定要最起码包含j才有意义,也就是判断i的第j位是否为1for(int k = 0; k < n; k ++ ) // 枚举所有转移的状态if((i - (1 << j)) >> k & 1) // 相从k这个点转移过来,则i状态除去j点后必须包含k这个点才有意义f[i][j] = min(f[i][j], f[i - (1 << j)][k] + w[k][j]); // 转移状态printf("%d\n", f[(1 << n) - 1][n - 1]);return 0;
}

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

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

相关文章

网络基础(三)

网络层与数据链路层 1.网络层2.IP2.1 基本概念2.2 协议头格式2.3 网段划分2.4 特殊的IP地址2.5IP地址的数量限制2.6 私有IP地址和公网IP地址2.7 路由 3.数据链路层4.以太网&#xff08;MAC帧协议&#xff09;4.1 认识以太网4.2 以太网帧格式4.3 认识MAC地址4.4 对比理解MAC地址…

51 -25 Scene as Occupancy 3D占用作为场景表示 论文精读

本文阅读的文章是Scene as Occupancy&#xff0c;介绍了一种将物体表示为3D occupancy的新方法&#xff0c;以描述三维场景&#xff0c;并用于检测、分割和规划。 文章提出了OccNet和OpenOcc两个核心概念。 OccNet 3D占用网络是一种以多视图视觉为中心的方法&#xff0c;通过…

14.0 Zookeeper环球锁实现原理

全局锁是控制全局系统之间同步访问共享资源的一种方式。 下面介绍zookeeper如何实现全民锁&#xff0c;讲解他锁和共享锁两类全民锁。 排他锁 排他锁&#xff08;Exclusive Locks&#xff09;&#xff0c;又被称为写锁或独占锁&#xff0c;如果事务T1对数据对象O1加上排他锁…

#免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程

Mac电脑苹果芯片读写NTFS硬盘bash脚本 &#xff08;ntfs.sh脚本内容在本文最后面&#xff09; ntfs.sh脚本可以将Mac系统(苹果M系芯片)上的NTFS硬盘改成可读写的挂载方式&#xff0c;从而可以直接往NTFS硬盘写入数据。此脚本免费&#xff0c;使用过程中无需下载任何收费软件。…

C#在既有数组中插入另一个数组:Array.Copy方法 vs 自定义插入方法

目录 一、使用的方法 1.使用Array.Copy方法 2.Copy(Array, Int32, Array, Int32, Int32) 3. 使用自定义的方法 二、实例 1.示例1&#xff1a;使用Array.Copy方法 2.示例2&#xff1a;使用自定义的方法 一、使用的方法 1.使用Array.Copy方法 首先定义了一个名为InsertAr…

【 buuctf-面具下的 flag】

直接 binwalk 提取图片内容其中 zip 为伪加密&#xff08;如下图&#xff09;&#xff0c;在 macOS 上当我运行 binwalk -e 指令来提取图片中内容是&#xff0c;zip可以自动解压出来 flag.vmdk&#xff0c;不需要修改压缩源文件目录区的全局方式位标记值。 在 kali Linux 下&am…

RabbitMQ-4.MQ的可靠性

MQ的可靠性 4.MQ的可靠性4.1.数据持久化4.1.1.交换机持久化4.1.2.队列持久化4.1.3.消息持久化 4.2.LazyQueue4.2.1.控制台配置Lazy模式4.2.2.代码配置Lazy模式4.2.3.更新已有队列为lazy模式 4.MQ的可靠性 消息到达MQ以后&#xff0c;如果MQ不能及时保存&#xff0c;也会导致消…

立足智能存取解决方案|HEGERLS智能托盘四向车储存制动能量 实现能源回收

对于商业配送和工业生产的企业而言&#xff0c;如何能高效率、低成本进行低分拣、运输、码垛、入库&#xff0c;用以提升仓库空间的利用效率&#xff0c;是现在大多企业急需要解决的行业痛点。对此&#xff0c;为了解决上述痛点&#xff0c;近年来&#xff0c;物流仓储集成商、…

docker常用10条容器操作命令

Docker 中一些常用的容器操作命令&#xff0c;我们可以根据需要使用这些命令来管理和操作 Docker 容器。我们这次以Hell-world这个镜像为例来说明&#xff1a; 1. docker pull hello-world #拉取hell-world镜像 2. docker images # 查看本地拉取的镜像 3. docker run hello…

【python】绘制爱心图案

以下是一个简单的Python代码示例&#xff0c;它使用turtle模块绘制一个代表爱和情人节的心形图案。 首先&#xff0c;请确保计算机上安装了Python和turtle模块。然后&#xff0c;将以下代码保存到一个.py文件中&#xff0c;运行它就可以看到爱心图案的绘制过程。 import turt…

20240203在Ubuntu20.04.6下配置stable-diffusion-webui.git

20240203在Ubuntu20.04.6下配置stable-diffusion-webui.git 2024/2/3 11:55 【结论&#xff1a;在Ubuntu20.04.6下&#xff0c;生成512x512分辨率的图像&#xff0c;大概需要11秒钟&#xff01;】 前提条件&#xff0c;可以通过技术手段上外网&#xff01;^_首先你要有一张NVID…

2024清洁能源、环境与智慧城市国际研讨会(ISCEESC2024)

2024清洁能源、环境与智慧城市国际研讨会(ISCEESC2024) 会议简介 2024年清洁能源、环境与智慧城市国际研讨会&#xff08;ISCEESC2024&#xff09;将在中国丽江举行。本次会议主要围绕清洁能源、环境和智慧城市等研究领域&#xff0c;旨在为该研究领域的专家学者提供一个国际…

用云手机打造tiktok账号需要注意些什么?

随着tiktok平台的火热&#xff0c;越来越多的商家开始尝试更高效的tiktok运营方法。其中&#xff0c;tiktok云手机作为一种新科技引起了很多人的注意&#xff0c;那么用云手机运营tiktok需要注意些什么&#xff1f;下文将对此进行详细解析。 1. 不是所有的云手机都适合做tiktok…

【分享】如何运用数字I/O来保护继电器

1.简述 在开关系统中&#xff0c;短路或者是开路的情况下&#xff0c;由于存在着额外的电流或者是电压&#xff0c;继电器往往会过载。所有的继电器都有一个最大的承载电流和热切换功率&#xff0c;如果超出了这个范围&#xff0c;会增加继电器焊接在一起的风险&#xff0c;从…

项目02《游戏-10-开发》Unity3D

【完成本集功能后共享1-10集整套代码】 基于 项目02《游戏-09-开发》Unity3D &#xff0c; 任务&#xff1a;传送至其他场景&#xff0c; 首先在场景中加入传送门&#xff0c; 设置人物标签&#xff0c; using UnityEngine; using UnityEngine.SceneManagement; u…

树莓派4b连接WQ9201外置无线网卡命令行配置详解

树莓派4B连接WQ9201无线网卡 接线方式 蓝色的线来连接树莓派和WQ9201demo板&#xff0c;USB接树莓派的USB接口&#xff0c;microUSB一端接demo板靠近天线部分的microUSB口。 驱动和固件准备 驱动直接放在树莓派系统的任意目录&#xff0c;目前配置则是将驱动放在树莓派的主目…

《Git 简易速速上手小册》第1章:Git 基础(2024 最新版)

文章目录 1.1 Git 简介&#xff1a;版本控制的演变1.1.1 基础知识讲解1.1.2 重点案例&#xff1a;协作开发流程优化案例&#xff1a;功能开发与分支策略 1.1.3 拓展案例 1&#xff1a;代码审查与合并1.1.4 拓展案例 2&#xff1a;冲突解决 1.2 安装和配置 Git&#xff1a;首次设…

代码随想录算法训练营第41天 | 343.整数拆分 96.不同的二叉搜索树

整数拆分 dp数组的含义&#xff1a;dp[i] 表示将 i 拆分所能得到的最大乘积。递推公式&#xff1a;dp[i] max(dp[i], max(j * (i - j), j * dp[i - j]))。我们对 j 从1开始遍历&#xff0c;检验不同的拆分方式能产生的最大乘积。对于拆分方式的选择&#xff0c;要么拆成 j 和 …

Win32 SDK Gui编程系列之--ListView自绘OwnerDraw(续)

通过所有者绘制的列表视图(2) 所有者绘制列表视图的基础已在前一页中说明。本页将展示如何在所有者绘制列表视图中显示数据库表数据。 1、访问日志 正如在另一个页面中所述,本网站的访问日志目前是通过SQLite3数据库管理的。 以下是上述程序执行的结果。为…

【MATLAB】使用随机森林在回归预测任务中进行特征选择(深度学习的数据集处理)

1.随机森林在神经网络的应用 当使用随机森林进行特征选择时&#xff0c;算法能够为每个特征提供一个重要性得分&#xff0c;从而帮助识别对目标变量预测最具影响力的特征。这有助于简化模型并提高其泛化能力&#xff0c;减少过拟合的风险&#xff0c;并且可以加快模型训练和推理…