Atcoder ABC338 F - Negative Traveling Salesman

Negative Traveling Salesman(消极的旅行推销员)

时间限制:6s 内存限制:1024MB

【原题地址】

所有图片源自Atcoder,题目译文源自脚本Atcoder Better!

点击此处跳转至原题

【问题描述】

在这里插入图片描述

【输入格式】

在这里插入图片描述
在这里插入图片描述

【输出格式】

在这里插入图片描述

【样例输入1】

3 4
1 2 5
2 1 -3
2 3 -4
3 1 100

【样例输出1】

-2

【样例输入2】

3 2
1 2 0
2 1 0

【样例输出2】

No

【样例说明1】

在这里插入图片描述

【样例说明2】

在这里插入图片描述

【解题思路】

老汉使用到的是Floyd算法+状压+树形dp的解题方式

本题是求任意起点和终点下,跑完所有点的最短总路程,首先想到的就是弗洛伊德算法(Floyd),对任意两点的最短距离进行求解,对下列思路进行分析,通过状态压缩的方式,利用树形表示集合中是否有该点存在,动态保存以不同的点做结尾点的最短总路程,最后进行比对是否存在这个总路程,不存在输出No,存在输出其中最小总路程
在这里插入图片描述

代码注释有详细过程

【代码】

package ABC338_F_NegativeTravelingSalesman;import java.nio.IntBuffer;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = scan.nextInt();int m = scan.nextInt();// d[i][j]存放i点到j点最短距离int[][] d = new int[n][n];// 对未存在赋值的两点距离做标记for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (i != j) {d[i][j] = Integer.MAX_VALUE;}}}for (int i = 0; i < m; i++) {int u = scan.nextInt();int v = scan.nextInt();int w = scan.nextInt();// u、v自减一,对应数组下标,例如1点改为0点--u;--v;// 题目说明无重边,直接用w赋初值,无需比对存放最小值d[u][v] = w;}// 弗洛伊德算法(Floyd),求任意两点最短距离for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {for (int k = 0; k < n; k++) {if (d[i][k] != Integer.MAX_VALUE && d[k][j] != Integer.MAX_VALUE) {d[i][j] = Math.min(d[i][j], d[i][k] + d[k][j]);}}}}// 状态压缩dp求解所有点都经过,接触最后一个点时,最短总距离int[][] dp = new int[1 << n][n];// 初始化dpfor (int i = 0; i < 1 << n; i++) {for (int j = 0; j < n; j++) {dp[i][j] = Integer.MAX_VALUE;}}// 起点初始为0for (int i = 0; i < n; i++) {dp[1 << i][i] = 0;}// 该维度表示走过点的集合,二进制情况下,该位的1代表对应点已加入集合// 例如:n为3,i属于[0000,1000),相当于[000,111],011代表第一、二个点在集合内,第三个点不在for (int i = 0; i < 1 << n; i++) {// 该维度表示当前集合中的最后一个点for (int j = 0; j < n; j++) {// 当当前集合中没有j元素,代表不符合规定,跳过// (当前集合最后一个点为j时,代表集合中一定有j,没有则不符合规定)if ((~i >> j & 1) == 1) {continue;}// 该维度为当前选中集合内的点for (int k = 0; k < n; k++) {// 该点不可能为集合最后一个点,即目不可能自己走向自己if (j == k) {continue;}// 该点必须存在于集合当中if ((~i >> k & 1) == 1) {continue;}// 用于比对的值为有效值时,进行比对赋值if (dp[i ^ (1 << j)][k] != Integer.MAX_VALUE && d[k][j] != Integer.MAX_VALUE) {// 判断没有j的集合到k总距离加上k到j的最短距离是否小于当前dp包含j的值dp[i][j] = Math.min(dp[i][j], dp[i ^ (1 << j)][k] + d[k][j]);}}}}int ans = Integer.MAX_VALUE;for (int i = 0; i < n; i++) {ans = Math.min(ans, dp[(1 << n) - 1][i]);}// ans为初始值代表不存在全部走完的可能if (ans == Integer.MAX_VALUE) {System.out.println("No");} else {System.out.println(ans);}scan.close();}
}

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

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

相关文章

windows 启动和关闭mysql

1)打开我的电脑-->2)在左边文件中右键此电脑--> 3)点击管理-->4)点击服务和应用程序-->5)点击服务-->6)查找自己MySQL名称 右击 启动或者关闭

Pytorch学习03_TensorBoard使用02

Opencv读取图片&#xff0c;获得numpy型数据类型 复制图片的相对路径 目前这种type不适用&#xff0c;考虑用numpy类型 安装opencv&#xff0c;在pytorch环境下 pip install opencv-python 导入numpy import numpy as np 将PIL类型的img转换为 NumPy 数组 img_arraynp.array…

电子邮件、SMTP、POP3 、IMAP协议

目录 1 电子邮件 1.1 电子邮件系统的组成 1.1.1 用户代理 UA (User Agent) 1.1.2 邮件服务器 (Mail Server) 1.1.3 邮件发送和读取协议 1.2 发送和接收电子邮件的重要步骤 1.3 电子邮件的组成 1.4 电子邮件地址的格式 2 简单邮件传送协议 SMTP 2.1 SMTP 通信的三个阶…

Vue--》深入学习Tailwind CSS掌握优雅而高效的前端样式开发

Tailwind CSS是一个非常强大且灵活的CSS框架&#xff0c;适用于开发者希望高度定制化界面样式的项目。今天博主就 Tailwind CSS 做一个简单介绍以及案例讲解&#xff0c;争取读者阅读文章后入门。 仅靠一篇文章博主也不可能将Tailwind CSS所有内容讲解的面面俱到&#xff0c;在…

揭秘产品迭代计划制定:从0到1打造完美迭代策略

产品迭代计划是产品团队确保他们能够交付满足客户需求的产品以及实现其业务目标的重要工具。开发一个成功的产品迭代计划需要仔细考虑产品的目标、客户需求、市场趋势和可用资源。以下是帮助您创建产品迭代计划的一些步骤&#xff1a;建立产品目标、收集客户反馈、分析市场趋势…

物联网和工业4.0

在当今这个快速发展的技术时代&#xff0c;物联网&#xff08;IoT&#xff09;和工业4.0成为了推动全球进入新工业时代的两大驱动力。对于刚入行的人来说&#xff0c;深入理解这两个概念及其背后的技术原理&#xff0c;对于把握未来的职业机会至关重要。 物联网&#xff0c;简…

php数组与字符串函数

php数组与字符串函数 1. php数组2. 字符串函数 1. php数组 在php中&#xff0c;有三种类型的数组&#xff1a; 数值数组 - 带有数字ID键的数组关联数组 - 带有指定的键的数组&#xff0c;每个键关联一个值多维数组 - 包含一个或多个数组的数组 2. 字符串函数 在PHP中&#xf…

一起玩儿Proteus仿真(C51)——05. 红绿灯仿真(一)

摘要&#xff1a;本文介绍如何仿真红绿灯 今天来做一个红绿灯仿真的程序&#xff0c;这个程序主要包括一下这些功能&#xff1a; 模拟的路口为十字交叉路口&#xff0c;假设东西和南北方向都是双向行驶&#xff0c;因此需要设置4组红绿灯和4个倒计时显示屏。倒计时时间最长为9…

web3知识体系汇总

web3.0知识体系 1.行业发展 2. web3的特点&#xff1a; 1、统一身份认证系统 2、数据确权与授权 3、隐私保护与抗审查 4、去中心化运行 Web3.0思维技术思维✖金融思维✖社群思维✖产业思维”&#xff0c;才能从容理解未来Web3.0时代的大趋势。 3.技术栈 Web3.jsSolidit…

OpenCV-38 图像金字塔

目录 一、图像金字塔 1. 高斯金字塔 2. 拉普拉斯金字塔 一、图像金字塔 图像金字塔是图像中多尺度表达的一种&#xff0c;最主要用于图像的分割&#xff0c;是一种以多分辨率来解释图像的有效但概念简单的结构。简单来说&#xff0c;图像金字塔是同一图像不同分辨率的子图…

累加器 - 分布式共享写变量

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 概念注意&#xff1a;应用 概念 因为RDD是可分区的&#xff0c;每个分区在不同的节点上运行&#xff0c;如果想要对某个值进行全局累加&#xff0c;就需要将每个task中的值取到然后进行累…

【C语言进阶】深度剖析数据在内存中的存储--上

1. C语言中的数据类型的简单介绍 注&#xff1a;C99标准里面&#xff0c;定义了bool类型变量。这时&#xff0c;只要引入头文件stdbool.h &#xff0c;就能在C语言里面正常使用bool类型。 1.1 在C语言中各类型所占内存空间的大小如下 char类型的数据类型大小为1字节即8比特位。…