题目大意为:有N个站,M条边把这些站连接起来,过这些边要花费的时间也会告诉你,然后有L个餐馆告诉你在哪个站,在餐馆吃也要花费时间,然后再告诉你起点S,再给你最多用的时间T,问你从起点出发再回到起点,在用最多不超过T时间下你能最多经过几个餐馆。

解法是先用一边FLOYD跑一遍,其实有用仅仅只有那L个餐馆和起点S之间的最短路,据说用SPFA跑(L+1)次效率会高很多。也是,毕竟L只有16个,但是N有300个。

然后才是关键步骤,用DP第一维表示状态,总数为(1<<L)-1,第二维是当前停靠的地点,比如DP[ 1001 ][ 0 ](第一维那是二进制),从后往前算,代表经过了第一个,第四个餐馆然后停在第一个餐馆的时间花费,怎么样推出这个呢?是由 DP[ 1000 ][ 3 ]+cost[ rest[3] ][ rest[0] ],以及DP[ 0001 ][ 0 ]+cost[ rest[0] ][ rest[3] ],二者中的最小值推出来的,为什么是rest[],因为这个数组是保存L个餐馆各在 图中哪个站的。具体细节自己想想吧。至于我写的时候IF里面漏加一个条件调了我好几个小时。。

AC代码:

#include<cstdio>
#include<ctype.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<ctime>
using namespace std;
#define NMAX 50000000
#define MOD 1000000007#define ll __int64int d[305][305],dp[1<<18][20];
int rest[20],rtime[20];
int n,m,l,s,t;void floyd()
{int i,j,k;for(k = 0; k < n; k++)for(i = 0; i < n; i++)for(j = 0; j < n; j++)d[i][j] = min(d[i][j],d[i][k]+d[k][j]);
}int main()
{//freopen("input.txt","r",stdin);//freopen("o1.txt","w",stdout);int i,j,k;while(~scanf("%d%d%d%d%d",&n,&m,&l,&s,&t) && n+m+l+s+t){for(i = 0; i < n; i++)for(j = 0; j < n; j++) d[i][j] = (i==j)?0:NMAX;for(i = 0; i < m; i++){int t1,t2,t3;scanf("%d%d%d",&t1,&t2,&t3);d[t1-1][t2-1] = t3;d[t2-1][t1-1] = t3;}floyd();for(i = 0; i < l; i++){int t1,t2;scanf("%d%d",&t1,&t2);rest[i] = t1-1;rtime[i] = t2;}memset(dp,-1,sizeof(dp));for(i = 0; i < l; i++){if(d[s-1][rest[i]] < NMAX)dp[1<<i][i] = d[s-1][rest[i]]+rtime[i];}int w,ans = 0;for(i = 1; i < 1<<l; i++){w = 0;for(j = 0; j < l; j++) if(i&(1<<j)) w++;for(j = 0; j < l; j++) if(i&(1<<j)){int temp = i-(1<<j);for(k = 0; k < l; k++) if(temp&(1<<k) && d[rest[k]][rest[j]] < NMAX && dp[temp][k]!=-1)if(dp[i][j] == -1)dp[i][j] = dp[temp][k]+d[rest[k]][rest[j]]+rtime[j];else dp[i][j] = min(dp[i][j],dp[temp][k]+d[rest[k]][rest[j]]+rtime[j]);if(dp[i][j] != -1 && dp[i][j]+d[rest[j]][s-1] <= t)ans = max(ans,w);}}printf("%d\n",ans);}return 0;
}

HOJ 12814 SIRO Challenge (状态压缩DP)相关推荐

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

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

  2. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

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

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

  4. hdu1074 状态压缩dp+记录方案

    题意:       给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案. 思路:       状态压缩dp,记录方案数的地方 ...

  5. FZU-2218 Simple String Problem(状态压缩DP)

    原题地址: 题意: 给你一个串和两个整数n和k,n表示串的长度,k表示串只有前k个小写字母,问你两个不含相同元素的连续子串的长度的最大乘积. 思路: 状态压缩DP最多16位,第i位的状态表示第i位字母 ...

  6. 《算法竞赛进阶指南》打卡-基本算法-AcWing 91. 最短Hamilton路径:位运算、状态压缩dp、dp

    文章目录 题目解答 题目链接 题目解答 分析: 状态压缩dp是用二进制数来表示状态. 数据范围n = 20, 那么状态总量就是2202^{20}220个状态. 可以按照以下思路去思考: 哪些点被用过 ...

  7. 状态压缩DP AcWing算法提高课 (详解)

    基础课的状态压缩点这里 基础课中 蒙德里安的梦想 属于 棋盘式状态压缩dp,最短Hamilton路径 属于 集合状态压缩dp 1064. 小国王(棋盘式/基于连通性) 这种棋盘放置类问题,在没有事先知 ...

  8. hdu 5067(状态压缩dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 解题思路:这道题开始想复杂了,想用bfs去求出最短距离,其实没必要,因为题目中没有阻碍关系,所以 ...

  9. hdu 5418(状态压缩dp+Floyd)

    点击打开链接 解题思路:这道题目和TSP问题很相似,唯一不同的是同一个点可以重复走几次.... 这道题目只有16个顶点,所以很容易想到状态压缩dp,dp[i][j]表示到达顶点i时的状态为j的最小花费 ...

  10. 状态压缩dp入门 第一题 POJ 3254 Corn Fields

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6460   Accepted: 3436 Descr ...

最新文章

  1. (1) 基于tomcat7和jdk1.7的websocket启动
  2. 网页缩放与窗口缩放_功能缩放—不同的Scikit-Learn缩放器的效果:深入研究
  3. java byreference_Java中各种引用(Reference)解析
  4. 并查集——亲戚(洛谷 P1551)
  5. linux中Cron定时任务系统命令详解
  6. 返回相同宽度数字型字符串
  7. 文言的理解 —— 古时的称谓、别称、别名
  8. Bash脚本15分钟进阶教程-转
  9. 从vSphere 5.5升级到6之2-升级vCenter Server 5.5到6.0
  10. svn利用钩子post-commit自动更新到线上测试服务器
  11. JavaWeb如何学?
  12. 鹏业安装算量软件运行环境_安装算量软件电脑配置
  13. 听说你要找前端工作,写一个酷炫的动画的简历呀
  14. 苹果手机语音备忘录在哪_苹果手机的录音功能在哪?教你快速开启,想录音太方便了...
  15. SVN服务器搭建、客户端安装超详细图解教程
  16. python英译汉库模块_Python 进阶之路-翻译模块
  17. 《现代数学基础丛书》
  18. 浙江大学计算机博士申请考核,考博经验|2020年浙江大学博士申请考核经验分享...
  19. 弱网络模拟测试工具---易测app
  20. PhotoShop CC 2017软件工具面板使用---污点修复画笔工具

热门文章

  1. 思维题:三个箱子,一个只装苹果,一个只装橙,另一个装苹果和橙,请问?
  2. 2017-11-18 借白银说点市场心得
  3. java繁体_Java-汉字繁体拼音转换
  4. matlab线条不平滑如何滤波,复杂曲线的包络线不平滑
  5. 计算机主机cpu图片,秒懂台式电脑处理器性能 桌面处理器天梯图2017年9月最新版...
  6. 多图识字 | 自动识别提取图片文字,微信小程序
  7. Git使用教程之初级入门命令行(二)
  8. android scrollview 设置高度,Android创建显示区高度可以调整的ScrollView
  9. 绕过校园网Web认证
  10. 乖离性百万亚瑟王服务器维护,重大更新!《乖离性百万亚瑟王》10月23日维护更新公告...