【算法每日一练]-旅行商(保姆级教程 篇1)

题目:TSP旅行商

旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。要求经过的路程为所有路径之中的最小值。

输入:                                输出:22
5 8
0 1 3
0 3 4
1 2 5
2 0 4
2 3 5
3 4 3
4 0 7
4 1 6

        

        

思路:

如果采用搜索+剪枝,算法复杂度为O(n!)。

而这种情况下恰好可以考虑状态压缩,常用的状态压缩为二进制,对应0和1两种状态

(当然如果有三种状态的话就要使用3进制,哦不对我们应该用4进制,因为4进制比3进制更快一点)

        
状态压缩:将集合作为整数来记录状态的算法
基于状压的dp是一类以集合信息为状态且状态总数为指数级的特殊的动态规划问题

        
我们设置dp[S][u]表示已经访问的集合为S,当前所在的节点为u所对应的最优解
dp[S][u]=min{dp[S|{v}][v]+g[u][v] }(v不属于S) 
因为dp[S][u]的下个状态就是dp[S|{v}][v]
        

下面给出记忆化dfs写法,一般来讲记忆化dfs比动态规划要快一点,因为动态规划往往会在计算无意义的状态中浪费时间。 

#include <bits/stdc++.h>//TSP旅行商问题
using namespace std;
int dp[1<<15][20],g[15][15],path[1<<15][15];//path为路径
int n,m,INF;void init(){memset(dp,-1,sizeof(dp));memset(g,0x3f,sizeof(g));INF=g[0][0];
}int run(int s,int u){if(dp[s][u]>=0) return dp[s][u];if(s==(1<<n)-1&&u==0) return dp[s][u]=0;int ans=INF;for(int v=0;v<n;v++)if(!(s>>v&1)&&g[u][v]!=INF){int tmp=run(s|1<<v,v)+g[u][v];if(ans>tmp){ans=tmp;path[s][u]=v;//保存后继(如果不存储集合的话)}//	ans=min(ans,run(s|1<<v,v)+g[u][v]);不输出路径的写法}return dp[s][u]=ans;
}
void print(int s,int u){if(s==(1<<n)-1)return;//这是倒序输出的写法,先找到终态然后倒着输出。如果我们存的是前驱,那就要正序输出了int v=path[s][u];cout<<"->"<<v;print(s|1<<v,v);
}
int main(){int u,v,w;cin>>n>>m;init();for(int i=0;i<m;i++){cin>>u>>v>>w;g[u][v]=w;}run(0,0);cout<<dp[0][0]<<'\n';cout<<0;print(0,0);//输出路径return 0;
}

        

        

题目:吃馅饼POJ3311

题意:一个人从0开始送外卖,每次送外卖不超过10个地方,给你两两之间所需的时间,求送完外卖回到店里的总时间最小,每个地方可以经历任意次

输入:(0表示结束)        输出:8
3
0 1 10 10
1 0 1 2
10 1 0 10
10 2 10 0
0
        

        

思路:

        

因为每个点可以走很多次,那么最好就是先把两点间最短距离写出(floyd),然后就转化成了旅行商问题
因为我们要把所有点都走至少一次,那么当旅行商问题可以解出答案时,就一定是最佳答案
                

                

#include <bits/stdc++.h>
using namespace std;
const int M=19,INF=0x3f3f3f3f;
int dp[1<<11][M],g[M][M],path[1<<15][15];//path为路径
int n;void init(){memset(dp,-1,sizeof(dp));memset(g,0x3f,sizeof(g));
}void floyd(){for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<n;j++)g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
}
int TSP(int s,int u){if(dp[s][u]>=0) return dp[s][u];if(s==(1<<n)-1&&u==0) return dp[s][u]=0;int ans=INF;for(int v=0;v<n;v++)if(!(s>>v&1)&&g[u][v]!=INF){int tmp=TSP(s|1<<v,v)+g[u][v];if(ans>tmp){ans=tmp;path[s][u]=v;//保存后继(如果不存储集合的话)}//ans=min(ans,run(s|1<<v,v)+g[u][v]);//不输出路径的写法}return dp[s][u]=ans;
}
void print(int s,int u){if(s==(1<<n)-1)return;//这是倒序输出的写法,先找到终态然后倒着输出。如果我们存的是前驱,那就要正序输出了int v=path[s][u];cout<<"->"<<v;print(s|1<<v,v);
}
int main(){while(scanf("%d",&n)==1&&n){n++;//加原点init();for(int i=0;i<n;i++)for(int j=0;j<n;j++)scanf("%d",&g[i][j]);floyd();memset(dp,-1,sizeof(dp));printf("%d\n",TSP(0,0));cout<<0;print(0,0);//输出路径}return 0;
}

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

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

相关文章

大数据:SAS数据分析1,数据步,和过程步

大数据&#xff1a;SAS数据分析 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sql…

java.lang.UnsupportedOperationException 关于Arrays.asList问题解决

解析String 字符串为List集合ArrayList<String> itemsList Arrays.asList(items.split("\\|")List<String> itemsList Arrays.asList(items.split("\\|")final Iterator<String> iterator itemsList.iterator();while (iterator.hasNex…

自定义类型之结构体

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

Altium Designer学习笔记5

整体修改元件标号&#xff1a; 重置Reset Schematic Designators: 恢复之前的状态。复位&#xff0c;恢复之前的状态。

安防视频监控管理平台EasyCVR定制首页开发与实现

视频监控平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#xff0c;也能支持视…

使用Kafka、Flink、Druid构建实时数据系统架构

1. 背景 对于很多数据团队来说&#xff0c;要满足实时需求并不容易。为什么&#xff1f;因为作流程&#xff08;数据采集、预处理、分析、结果保存&#xff09;涉及大量等待。等待数据发送到 ETL 工具&#xff0c;等待数据批量处理&#xff0c;等待数据加载到数据仓库中&#…

【设计模式】七大设计原则

七大设计原则 文章目录 七大设计原则一、概述二、单一职责原则三、接口隔离原则四、依赖倒转原则五、里氏替换原则六、开闭原则七、迪米特法则八、合成复用原则 一、概述 设计模式是为了让程序(软件)&#xff0c;具有更好代码重用性&#xff0c;可读性&#xff0c;可扩展性&am…

Vulhub靶场-KIOPTRIX: LEVEL 1.1

目录 环境配置 端口扫描 漏送发现 漏送利用 提权&#xff08;内核漏洞提权&#xff09; 环境配置 环境配置的过程同主页该专栏第一个靶场&#xff0c;不在赘述。 端口扫描 首先通过arp-scan并根据靶机的mac地址确定靶机的IP地址 然后对靶机进行一个扫描 首先扫描到OpenS…

C++--STL学习笔记

参考教程&#xff1a;黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibili 软件界一直希望建立一种可重复利用的东西&#xff0c;C的面向对象和泛型编程思想&#xff0c;目的就是复用性的提升。 大多情况下&#xff0c;数据结构和算法都未能有一套标准,…

线程(线程基本概念、java实现多线程、使用多线程、线程的生命周期、线程同步、线程死锁)

&#xff08;一&#xff09;线程基本概念 一、 程序, 进程, 线程的概念 程序: 使用某种语言编写一组指令(代码)的集合,静态的 进程: 运行的程序,表示程序一次完整的执行, 当程序运行完成, 进程也就结束了 个人电脑: CPU 单个, 双核, CPU的时间分片, 抢占式 每个独立执行的程…

OpenCV快速入门:目标检测——轮廓检测、轮廓的距、点集拟合和二维码检测

文章目录 前言一、轮廓检测1.1 图像轮廓的概念1.2 轮廓检测算法简介1.3 轮廓检测基本步骤1.4 轮廓检测函数说明1.4.1 轮廓发现1.4.2 轮廓面积1.4.3 轮廓周长1.4.4 轮廓外接多边形1.4.5 点到轮廓距离1.4.6 凸包检测 1.5 轮廓检测代码实现 二、轮廓的距2.1 几何距2.2 中心距2.3 H…

ssh远程连接不了虚拟机ubuntu

直奔主题 1. 确保linux安装了ssh2.查看网络适配器是否启用3.连接成功 1. 确保linux安装了ssh sudo apt-get install openssh-server2.查看网络适配器是否启用 3.连接成功

VBA技术资料MF85:将工作簿批量另存为PDF文件

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

如何实现车机体验”遥遥领先”?头部玩家已经给出答案

车机与手机的深度融合&#xff0c;通过跨终端互联互通实现全场景、沉浸式的用户体验&#xff0c;正在成为各大高端智能汽车品牌的新战场。 此前&#xff0c;已经有华为、苹果几大手机巨头已经纷纷开启“造车”业务&#xff0c;同时吉利等车企也反向进入手机领域&#xff0c;各…

TransmittableThreadLocal - 线程池中也可以传递参数了

一、InheritableThreadLocal的不足 InheritableThreadLocal可以用于主子线程之间传递参数&#xff0c;但是它必须要求在主线程中手动创建的子线程才可以获取到主线程设置的参数&#xff0c;不能够通过线程池的方式调用。 但是现在我们实际的项目开发中&#xff0c;一般都是采…

快来看看你的手表是否有忘记关闭的应用在后台偷偷耗电?

在这个智能化的时代&#xff0c;手表已经不仅仅是用来看时间的工具&#xff0c;它更是我们生活的助手&#xff0c;从消息提醒到健康监测&#xff0c;它似乎无所不能。但与此同时&#xff0c;你是否注意到手表电量的续航有时长&#xff0c;有时慢&#xff1f;有可能&#xff0c;…

C语言每日一题(33)随机链表的复制

力扣138 随机链表的复制 题目描述 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都…

解锁OpenAI潜力:OpenAI 全面解析与最佳实践

该项目是由OpenAI公司提供的一个大型代码库&#xff0c;其中包含了各类与OpenAI API相关的代码示例和最佳实践。 此项目名为OpenAI Cookbook&#xff0c;目的是为了帮助使用者更有效地利用OpenAI API&#xff0c;将其应用于自己的工作和生活中。具体来说&#xff0c;可以解决一…

打码平台之图鉴的使用步骤

打码平台之图鉴 背景&#xff1a; ​ 今天给大家推荐一个我一直使用的验证码识别平台&#xff0c;图鉴&#xff0c;我没有收费&#xff0c;我只是觉得这个网站使用方便&#xff0c;支持验证码种类多&#xff0c;好了&#xff0c;话不多说&#xff0c;上教程&#xff01; 注册…

SmartX 超融合 5.1 版本有哪些新特性和技术提升?

近日&#xff0c;SmartX 正式发布了超融合产品组合 SmartX HCI 5.1 版本&#xff0c;以全面升级的超融合软件、分布式块存储、容器管理与服务、软件定义的网络与安全等组件&#xff0c;为虚拟化和容器负载在计算、存储、网络和管理层面提供统一的架构和生产级别的能力支持。本期…