这个是经典状态压缩dp tsp问题的变形

首先来看看《挑战程序设计竞赛》讲解tsp问题:

给定一个n个定顶点组成的带权有向图的距离矩阵d(i,j)(INF表示没有变)。要求从顶点0出发,经过每个顶点恰好一次后再回到顶点0。问所经过得边的总权重的最小值是多少?

限制条件

1<n<16

0<d(i,j)<1000

tsp问题是np困难的。没有已知的的多项式时间的高效算法可以解决这一问题。

所有可能的路线共有(n-1)!种。这是个非常大的值。即使在本题中n已经很小了。仍然无法试遍每一种情况。对于这个问题我们可以使用dp来解决。首先让我们试着写出它的递推式。

假设现在已经访问过得顶点的集合(起点0当做还未访问过的顶点)为S.当前所在顶点为v,用dp[S][v]表示从v出发访问剩余的所有顶点。最终回到顶点0的路径的权重总和的最小值。由于从v出发可以移动到任意一个节点u不属于S,因此有如下递推式:

dp[V][0]=0;

dp[S][v]=min{dp[S∪{u}][u]+d(v,u)|u不属于S};

我只要按照这个递推式进行计算就可以了。这样就可以在O(2^n*n^2)的时间里完成计算。

旅游

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述

有n个城市,一个人去旅游,他想游遍n个城市,且每个城市最多去两次,问最短的路程是多少。

起点任意,每两个城市之间可能会有多条路,也可能会没有路。如果能游遍所有的城市

输出最少的,不能的话输出-1

输入
有多组测试数据,每组都有一个正整数n和m(n>1&&n<=10,m>0)
n表示由n个城市,接下来有m行,每行三个正整数,u,v,w表示
u和v之间有一条长为w的路(w>=0&&w<300)。
输出
每组数据输出一行,如果能游遍所有的城市,输出最短的距离,如果不能,输出-1
样例输入
样例输入

这道题与经典tsp问题用的是同一种dp递推式。区别是:(1)不需要回路(2)顶点限制的次数+1

经典tsp问题它要求顶点只能遍历一次,所以对于dp的状态,记录的是该顶点的入度。而在这道题里入度的要求则变成了indegree小于等于2.所以问题就从经典tsp的二进制的状态压缩变成了三进制的状态压缩.

对于三进制的状态转移因为不能用位运算了,所以就要对三进制的操作进行预处理并用数组保存。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Max_V 12
#define INF 0x3f3f3f3f
int n,m;
int g[Max_V][Max_V];
int ter[60000][Max_V];//ter[S][v]表示在S状态中v顶点的入度
int bit[]={1,3,9,27,81,243,729,2187,6561,19683,59049};
int dp[60000][Max_V];
int findMin(int x,int y)
{return x>y?y:x;
}
void ternary_init()
{//对三进制的操作做预处理
<span style="white-space:pre"> </span>int i, j, b; for(i=0;i<bit[10];i++) { b=i; for(j=0;j<10;j++) { ter[i][j] =b % 3; b/=3; } }
}
void init()
{//初始化memset(g,-1,sizeof(g));memset(dp,INF,sizeof(dp));for(int i=0;i<n;i++)dp[bit[i]][i]=0;
}
int main()
{int i;int u,v,w;ternary_init();while(~scanf("%d%d",&n,&m)){init();for(i=0;i<m;i++){scanf("%d%d%d",&u,&v,&w);if(g[u-1][v-1]>w||g[u-1][v-1]==-1)g[u-1][v-1]=g[v-1][u-1]=w;}int ans=INF;for(int S=0;S<bit[n];S++){//遍历所有状态int flag=true;for(u=0;u<n;u++){if(ter[S][u]==0)flag=false;if(dp[S][u]==INF)continue;for(v=0;v<n;v++){if(u==v||g[u][v]==-1||ter[S][v]>=2)continue;dp[S+bit[v]][v]=findMin(dp[S+bit[v]][v],dp[S][u]+g[u][v]);//状态转移}}if(flag){//所有顶点的入度都大于0for(u=0;u<n;u++)ans=findMin(ans,dp[S][u]);}}if(ans==INF)printf("-1\n");else printf("%d\n",ans);}return 0;
}

nyoj-1182旅游【三进制状态压缩dp】相关推荐

  1. hdu3001 Travelling 三进制状态压缩dp

    tsp类型,只是这里面的点最多可以访问2次. 所以用一个来表示访问了多少次,正好是三进制. 对于每个状态i,先处理出第j位为几,即num[i][j],方便使用. 用dp[i][j]表示,状态i时,以j ...

  2. BZOJ4479 [JSOI2013] 吃货jyy 解题报告(三进制状态压缩+欧拉回路)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4479 Description [故事背景] 作为JSOI的著名吃货,JYY的理想之一就是 ...

  3. #10172. 「一本通 5.4 练习 1」涂抹果酱 【 三进制状态压缩 】【 方案数 】

    Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M 的矩形,它被划分成 N×M 个边长为 1×1 的小正方形区域(可以把蛋糕当成 NNN 行 MMM 列的矩阵) ...

  4. hdu4064 三进制状态压缩 好题!

    还不太会做这类题,总之感觉有点难啊. 用深搜代替打表求出一行所有的可行状态,注意要进行剪枝 这是自己理解的代码,但是tle了 #include<bits/stdc++.h> using n ...

  5. poj 1185 NYOJ 85 炮兵阵地(状态压缩dp)

    炮兵阵地 时间限制:2000 ms  |  内存限制:65535 KB 难度:6 描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地 ...

  6. hdu3001(状态压缩dp)

    题目链接: 点击打开链接 题目: After coding so many days,Mr Acmer wants to have a good rest.So travelling is the b ...

  7. 状态压缩DP(大佬写的很好,转来看)

    奉上大佬博客 https://blog.csdn.net/accry/article/details/6607703 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的 ...

  8. bzoj4479: [Jsoi2013]吃货jyy 欧拉回路+状态压缩Dp

    bzoj4479: [Jsoi2013]吃货jyy Description [故事背景] 作为JSOI的著名吃货,JYY的理想之一就是吃遍全世界的美食.要走遍全 世界当然需要不断的坐飞机了.而不同的航 ...

  9. 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)

    目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...

  10. BZOJ1688|二进制枚举子集| 状态压缩DP

    Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...

最新文章

  1. Geoffrey Hinton 等6位图灵奖得主和100多位专家邀请您共话人工智能下一个十年
  2. 什么文件使用.md扩展名,我该如何编辑它们?
  3. SCCM2012SP1---配置客户端发现方法和边界组
  4. 统一沟通-技巧-13-Lync-Polycom RMX 1500-配置
  5. 小余学调度:电气主接线的形式、特点、倒闸操作
  6. 角色动作系统概述:战斗、3C相关
  7. Spring Cloud Gateway 整合阿里 Sentinel网关限流实战
  8. 计算机等级考试初级网络工程师,2019年全国计算机等级考试网络工程师四级,需..._网络编辑_帮考网...
  9. MeEdu - 开源在线教育点播系统。
  10. html嵌入audio格式不支持,html5中audio支持音频格式的解决方法
  11. Spring-beans-BeanDefinitionRegistry
  12. CTF-实验吧-安全杂项-社交网络
  13. RK3399 USB RNIDS/gagnet实战
  14. 快速入门Sass:Sass中的体系结构
  15. dos从优盘启动计算机,对老旧电脑升级很重要,教你制作纯DOS的U盘启动盘
  16. 案例分析十大管理领域理论背诵要点
  17. EXCEL常用函数——计算统计函数
  18. 某三位数除以10余9、除以9余8、除以8余7
  19. 什么是驻点和拐点_拐点和驻点的区别是什么
  20. 【youcans 的 OpenCV 例程 200 篇】119. 图像的形态学梯度

热门文章

  1. Gos ——内存管理系统
  2. 寒月聊健康;手指麻 刺痛 无力你可能是腕管综合症
  3. 【RTD】二分法查找和分段线性插值算法在RTD中应用
  4. html图片做成菱形,CSS秘密花园:菱形图片
  5. 赛码网输入输出(js v8)问题并配置赛码网vscode本地环境
  6. 赛码浪潮笔试题库软件实施岗位_校园招聘在线笔试,原来大家都在用赛码
  7. 【View基础知识】TouchSlop、VelocityTracker、GestureDetector、Scroller
  8. Oracle RAC Failover 说明
  9. [已解决]The server cannot or will not process the request due to something that is perceived to be
  10. virtualBox安装拓展包extension pack失败 --解决办法