poj 3311 dp求解TSP

旅行商问题 TSP问题 状压dp入门 + floyd poj 3311 hdu 5418 旅行商问题 & TSP问题:有n个城市,从起点 0 开始游历每一个城市,只访问每个城市一次,最后回到起点,所需要的最短路径是多少? 这个属于NP完全问题。最直接的方法就是枚举法,解空间为n个元素的所有排列组合,为(n−1)!(n-1)!。n稍微一大就无法在有限的时间内做出。还有一些模拟退火算法什么的,这个不太了解,有空再去了解下。 在acm中,对于此问题,n一般都不大,可以运用floyd + 状 阅读详情

题意:一个开披萨店的要把披萨所购所有购买者。一直披萨店在位置0,n个购买者分别在位置1-n。题目给出这n+1个点之间的直线距离,问送货员从披萨店出发,送给所有的购买者且最后回到披萨店所需要的最小距离。

思路:现用floyd处理一下给定的图,剩下的就是TSP问题了。题目给的数据范围比较小(n<=10),可以考虑动态规划方法。目前为止都送给了哪些购买者用一个状态(一个数)表示,相应位为1表示经过过,为0表示未经过。dp[ i ][ j ]表示状态i^(1<<j) (也就是从状态 i 中除去 j 城市的那个状态)到城市 j 的最短距离(更为准确的说,是i相应位为1的点都已经经过,而且最后经过的点是j代表的点的最短距离)。状态转移方程也就是dp[ i ][ j ] = min(dp[ i ] [ j ] , dp[ pre ][ k ]+dis[ k ][ j ])。(其中pre选择为从状态 i 中除去 j 城市的那个状态)。

那么动归有两个方向可以写,第一个版本是对每一个状态,通过状态转移方程进行更新。第二个版本是枚举每个状态,将其能达到的地方进行更新。

时间复杂度都是O(n*n*2^n)。

版本1:

#include <stdio.h>
#include <string.h>
#define INF 0x3fffffff
#define min(a,b) ((a)<(b)?(a):(b))
#define N 15
int n;
int g[N][N],dp[1<<11][N];
void floyd(){
	int i,j,k;
	for(k = 0;k<=n;k++)
		for(i = 0;i<=n;i++)
			for(j = 0;j<=n;j++)
				g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
}
void solve(){
	int i,j,k,m,res = INF;
	m = 1<<n;
	for(i = 0;i<m;i++)
		for(j = 1;j<=n;j++){
			if(i == (1<<(j-1))){
				dp[i][j] = g[0][j];
				continue;
			}
			if((1<<(j-1)) & i){
				dp[i][j] = INF;
				for(k = 1;k<=n;k++)
					if( ((1<<(k-1))&i) && k!=j)
						dp[i][j]=min(dp[i][j],dp[i^(1<<(j-1))][k]+g[k][j]);
			}
		}
	for(i = 1;i<=n;i++)
		res = min(res,dp[m-1][i]+g[i][0]);
	printf("%d\n",res);
}
int main(){
	freopen("a.txt","r",stdin);
	while(scanf("%d",&n) && n){
		int i,j;
		for(i = 0;i<n+1;i++)
			for(j = 0;j<n+1;j++)
				scanf("%d",&g[i][j]);
		floyd();
		solve();
	}
	return 0;
}

版本2:

#include <iostream>
#include <algorithm>
using namespace std;
#define N 12
int s[N][N],n;
int dp[1<<11][11];
void floyd(){
	for(int k = 0;k<=n;k++)
		for(int i = 0;i<=n;i++)
			for(int j = 0;j<=n;j++)
				s[i][j] = min(s[i][j],s[i][k]+s[k][j]);
}
int solve(){
	int m = 1<<n;
	for(int i = 0;i<m;i++)
		for(int j = 0;j<n;j++)
			dp[i][j] = 0x7fffffff;
	for(int i = 0;i<n;i++)
		dp[1<<i][i] = s[0][i+1];
	for(int i = 1;i<m;i++)
		for(int j = 0;j<n;j++)
			if(i&(1<<j))
				for(int k = 0;k<n;k++)
					if(0==(i&(1<<k)))
						dp[i|(1<<k)][k] = min(dp[i|(1<<k)][k],dp[i][j]+s[j+1][k+1]);
	int res = 0x7fffffff;
	for(int i = 0;i<n;i++)
		res = min(res,dp[m-1][i]+s[i+1][0]);
	return res;
}
int main(){
	while(cin>>n){
		if(n==0)
			break;
		for(int i = 0;i<=n;i++)
			for(int j = 0;j<=n;j++)
				cin>>s[i][j];
		floyd();
		cout<<solve()<<endl;
	}
	return 0;
}


TSP问题(状压DP求解) TSP问题即最短旅行商问题,在给定的带权无向图中求得一条最短的哈密顿路.这个问题我们在离散数学课上有讲过,是NPhard但是数据范围较小的时候我们还是可以通过一些算法求得近似解.白书上介绍了一种很经典的状压dp求解方法.  dp[s][v],s表示一个点的集合,这个集合可以是DAG中所有点的子集,这里我们用s来代表所有已经到过的点,用dp[s][v](v∈s)代表从v点出发经过除s以外的所有点后 阅读详情

相关推荐

动态规划解TSP问题(状态压缩dp)

动态规划解TSP问题(状态压缩dp)TSP问题简述  给定图上若干个点,以及他们之间的距离,求一条距离和最小的回路,使得该回路正好经过每个点一次。TSP也叫旅行商问题、货郎担问题。。。状态转移方程  用 V’ 表示一个点的集合,假设从顶点 s 出发, d ( i , V’ ) 表示当前到达顶点 i,经过 V’ 集合中所有顶点一次的最小花费。1.当 V’ 为仅包含起点的集合,也就是:d ( s , {

Eason的博客 1万+

旅行商TSP问题

旅行商问题(TSP问题):每个点经过有且仅有一次的最短回路 解法:动态规划 HDU5067:经典TSP问题 #include <bits/stdc++.h> using namespace std; int const inf = 0x3f3f3f3f; typedef pair<int,int>pii; int const N = 12; int n,m,mp[N][N],dp[1<<N][N],cnt; pii a[N]; int TSP(){ /

FlyingJack 487

POJ3311(TSP问题,状态压缩DP)

题目链接:http://poj.org/problem?id=3311 分析:由于题中明确说了两个城市间的直接可达路径(即不经过其它城市结点)不一定是最短路径,所以需要借助邻接矩阵首先求出任意两个城市间的最短距离。这一步骤使用Floyd最短路径算法即可。然后,在此基础上来求出遍历各个城市后回到出发点的最短路径的距离,即求解TSP问题。 考虑搜索算法:这种解法其实就是计算排列子集树的过程。从0点

qust1508060414的博客 3379

货郎担问题TSP(dp解法)

货郎担问题也叫旅行商问题,即TSP问题(Traveling Salesman Problem),是数学领域中著名问题之一。 题目背景 有n个城市,用1,2,…,n表示,城i,j之间的距离为dij,有一个货郎从城1出发到其他城市一次且仅一次,最后回到城市1,怎样选择行走路线使总路程最短? 货郎担问题(TSP问题)是一个组合优化问题。 该问题可以被证明具有...

weixin_30872671的博客 2469

代码复现——SymAgent:一种用于知识图谱复杂推理的神经符号自学习Agent框架

根据《SymAgent: A Neural-Symbolic Self-Learning Agent Framework for Complex Reasoning over Knowledge Graphs》(《SymAgent:一种用于知识图谱复杂推理的神经符号自学习Agent框架》)论文思路,简单复现代码,以实现SymAgent中的Agent-Planner和Agent-Executor模块。Agent-Planner利用大语言模型的归纳推理能力从知识图谱中提取符号规则,指导高效的问题分解。

qq_60040306的博客 1605

用Python和sklearn预测NBA比赛胜负:从数据清洗到模型优化的完整流程

本文详细介绍了如何使用Python和sklearn构建NBA比赛胜负预测模型,涵盖从数据清洗、特征工程到模型优化与部署的完整流程。通过对比随机森林、XGBoost等主流算法,提供实战技巧和解决方案,帮助数据爱好者掌握体育数据分析的核心技术。

weixin_30823001的博客 133

poj3311 经典tsp问题

TSP问题目前有多种解法:搜索解法,动归解法,启发式解法。这里就针对poj 3311问题给出了前两种解法。 搜索解法:这种解法其实就是计算排列子集树的过程。从0点出发,要求遍历1,2,3点后回到0点。以不同的顺序来依次遍历1,2,3点就会导出不同的路径(0->1->2->3->0;0->1->3->2->0等等),总共有3!=6条路径需要考虑,从中选出最短的那条就是所求。搜索解法的时间复杂度为O(n!)。 动归解法:仔细观察搜索解法的过程,其实是有很多重复计算的。比如从0点出发,经过1,2,3,4,5点后回

hustluy的专栏 2560

基于深度学习的X光安检危险品检测系统(YOLOv8 + UI界面 + 数据集)

随着全球安全形势的变化,机场、车站、地铁等场所的安检工作日益重要。X光安检系统已经成为现代公共安全领域中不可或缺的部分,能够有效地检测物品的内部结构,识别潜在的危险品。然而,传统的X光图像分析方法仍然依赖人工操作,检测效率较低,并且易受到人为因素的影响。近年来,深度学习技术的应用在图像分析领域取得了显著的突破,特别是在目标检测任务中,YOLO(You Only Look Once)模型因其高效性和精度,成为了许多目标检测任务的首选模型。

YOLO 1061

【算法每日一练]-图论 篇13(旅行商) TSP旅行商 ,POJ3311吃馅饼

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

m0_69478376的博客 659

Java接入DeepSeek大模型:从零实现流式对话+多轮会话管理(完整项目实战)

emitter.completeWithError(new RuntimeException("连接DeepSeek服务超时"));private static final Set<String> BLACK_WORDS = Set.of("暴力", "色情", "政治敏感");emitter.onCompletion(() -> log.info("SSE连接完成"));emitter.onTimeout(() -> log.warn("SSE连接超时"));// 每个路由基础连接数。

wjianwei666的专栏 931

Qt C++ + Qt 3D 的数字孪生工厂

以下是一个基于 **Qt C++ + Qt 3D** 的数字孪生工厂完整源码示例,集成了 **Qt 3D** 产线建模和 **WebSocket** 实时数据交互。ui->qualifiedProductsLabel->setText(QString("合格产品: %1").arg(data.qualifiedProducts));ui->totalProductsLabel->setText(QString("总产量: %1").arg(data.totalProducts));

寒寒豆豆软件公司的博客 149

POJ3311 Hie with the Pie(DP:TSP问题)

题意: 要到n个城市送披萨,每个城市只能经过一次,最后要回到原点,求最短路径。 要点: 经典的TSP问题,从0出发找到一条回路回到0,这就意味着可以回溯到前面的城市重新出发,这样就比较难。基本上可以想到先用Floyd算法求出每两个点的最短路径,然后就是DP,定义一个d[i][s]数组,表示当前在第i个城市,已经经过了s集合中的城市(包括i),s用二进制存储。 这样可以写出状态转移方程:d[

SeasonJoe的博客 606

RedCap:一种通信技术的概述

总结起来,RedCap是一种基于数据包交换的通信技术,它提供了一种高效、可靠的数据传输机制。通过使用RedCap,我们可以轻松地发送和接收数据包,并确保数据的完整性和正确性。在上面的示例中,我们首先导入了RedCap库,并创建了一个RedCap实例。然后,我们定义了目标地址和源地址,并创建了一个数据包,其中包含了目标地址、源地址和要发送的数据。本文将介绍RedCap的基本原理和使用方法,并提供一些相关的源代码示例。RedCap还提供了其他一些功能,如数据包的重传机制、流量控制和拥塞控制等。

YgjWeb的博客 900

POJ 3311 Hie with the Pie (TSP问题 状压DP解法)

TSP问题的状态DP解法: 题意:从1点开始遍历全图的点后回到起点的最短路径问题 因为TSP不限制每个点遍历的次数,所以可以用floyd处理下两点间的距离,之后DP处理下, DP[i][j]表示状态为二进制i下,当前遍历第j个点的最小值,DP[1   #include

jxy859的专栏 1859

javafx结合Scene Builder自定义fxml实现漂亮的登录界面、自定义最小化、关闭按钮

本节主要介绍了如何结合Scene Builder工具来制作一个好看又漂亮的登录界面,以及介绍了如何在程序中调用生成界面文件fxml文件,如何获取到fxml文件中的组件等,并演示登录、最小化和关闭等功能。

c1007857613的专栏 5222

MicroBlaze系列教程(5):AXI_UART16550的使用

axi-uart16550是Xilinx的一款串口IP核,支持配置成16450或16550模式,16550和16450是指的早期电脑主板上的串口芯片型号,16550相比于16450多了FIFO,现在已经很少使用。相比于,16550支持1或2位停止位,包括uartlite所有的功能,而且支持在SDK中灵活对波特率、数据、校验方式进行配置。与uartlite不同的是,不能单独指定发送中断和接收中断函数,只有一个中断函数,通过event参数来区分当前是发送或接收中断。

whik1194的博客 4543

POJ 3311 Hie with the Pie (状压DP)

题目地址:POJ 3311 这题基本可以算是TSP问题,先用floyd预处理出来任意两个间对的最短路,注意是有向边。。。然后定义dp[i][j]表示在i状态下最后一个经过的城市为j的最短时间。然后状压即可。 代码如下: #include #include #include #include #include #include #include #include #includ

scf0920 831

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

poj3311 TSP问题 状压DP

题意:从0走遍1~n最后再返回到0,一个点可以走多次,求经过的最短距离。 分析:由于一个点可以走多次,所以需要求出任意两点间的最短距离,就要用到floyd算法,同时接下来可以搜索做复杂度是O(n!),而状态压缩的时间效率就高了,关于DP自己有时候状态转移方程知道了,却不知道如何去实现,循环时哪层放在外面,哪层放在里面,所以很容易把DP写成了暴力的搜索,自己要多想想。 状态转移方程:dp[S][

wenzhunpu的专栏 597

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

poj 3311

挺基础挺经典的状压DP,叫TSP来着? 1 //#include<bits/stdc++.h> 2 #include<cstdio> 3 #include<cstring> 4 #include<iostream> 5 #include<queue> 6 #include<algorit...

diyan5166的博客 195

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Hie with the Pie(POJ3311+floyd+状压dp+TSP问题dp解法)

题目链接:http://poj.org/problem?id=3311 题目: 题意:n个城市,每两个城市间都存在距离,问你恰好经过所有城市一遍,最后回到起点(0)的最短距离。 思路:我们首先用floyd预处理出每两个城市间的最短路,然后采用状压dp来解题。dp[i][j]表示在i这种状压下以j为目标城市的最短距离,i的二进制中x位为1表示到了城市x,为0表示没到城市x,则...

di6499的博客 185

[POJ 3311]Hie with the Pie——再谈TSP问题的DP解法

题目连接:  http://poj.org/problem?id=3311 题目大意:有n+1个点,给出点0~n的每两个点之间的距离,求这个图上TSP问题的最小解 思路:用二进制数来表示访问过的城市集合,f[{S}][j]=已经访问过的城市集合为S,访问了j个城市,所需的最少花费。 这里提一下二进制数表示集合的方法(这里不妨设集合中最多有n个元素): 如果集合S中最多会出现n个元素

某沙茶的OI代码库 1229

[TSP+floyd]POJ3311 Hie with the Pie

题意: 给i到j花费的地图 1到n编号 一个人要从1遍历n个城市后回到1 求最小的花费(可以重复走) 分析 http://www.cnblogs.com/Empress/p/4039240.html TSP 因为可以重复走 所以先floyd一下求最短路 1 #include <cstdio> 2 #include <cstdl...

aicheng4794的博客 126

POJ 3311 状压DP+floyd

http://poj.org/problem?id=3311 题意:n∗n的矩阵,d[i][j]表示点i到点j的距离,求从0出发经过所有点后回到0的最短路n*n的矩阵,d[i][j]表示点i到点j的距离,求从0出发经过所有点后回到0的最短路n∗n的矩阵,d[i][j]表示点i到点j的距离,求从0出发经过所有点后回到0的最短路 题解:如果暴力枚举,那么需要n!的复杂度,所以想到用dp。如果暴力枚举,...

WayJasy的博客 157

poj3311 TSP经典状压dp(Traveling Saleman Problem)

题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短。最后输出最短距离即可。注意:每一个地方可重复访问多次。 经典的状压dp,因为每次送外卖不超过10个地方,可以压缩。 由于题中明确说了两个城市间的直接可达路径(即不经过其它城市结点)不一定是最短路径,所以需要借助fl...

weixin_30646505的博客 140

poj 3311 状压DP

经典TSP变形 学到:1、floyd  O(n^3)处理任意两点的最短路     2、集合的位表示,我会在最后的总结出写出。注意写代码之前一定设计好位的状态,本题中,第0位到第n位分别代表第i个城市,1是已经走过,0没走过 那么DP方程  :dp[s][i]--当前在城市i,状态为s(s存储的是走过了那些城市)             3、最后要求形成回路,那么就是min(

Pilgrim 1029
上一篇: poj 2438 构造哈密顿圈(孩子只想和喜欢的相邻)
下一篇: poj 1222 枚举(关灯游戏)
dumeichen
博客等级 码龄13年 55粉丝 475原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值