【LDU】 Week2自测 Disney‘s FastPass | 状压dp、Floyd
这题是hdu 4114...
跟着19的打了打周测,发现个好题
写了写还wa了一发
题目大意:
给出n个点,k个要旅游的景点,然后给出k个景点的信息(位置,t,ft,门票所在地点),t于ft表示,如果参观这个经典使用门票则需要ft时间,否则需要t时间。问参观完所有经典并且返回来的最短路。
题目思路:
经典套路状压dp了,类似于状压dp求哈密尔顿回路
由于涉及到两个状态,所以设状态:i,k分别为门票的状态二进制 与 访问状态的二进制
然后就直接进行状压dp就好了,注意的是最短路最好提前处理好,点数比较小Floyd就好了
Code:
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
using namespace std;
const int N=1e3+15;
typedef long long ll;
const ll INF = 1e18;
double PI=acos(-1.0);
inline bool read(ll &num)
{char in;bool IsN=false;in=getchar();if(in==EOF) return false;while(in!='-'&&(in<'0'||in>'9')) in=getchar();if(in=='-'){ IsN=true;num=0;}else num=in-'0';while(in=getchar(),in>='0'&&in<='9'){num*=10,num+=in-'0';}if(IsN) num=-num;return true;}
const int maxn=1e6+5;
ll n,m,p;
ll mp[55][55];
ll dp[55][1<<8][1<<8];
ll f[55];
int pos[55],ft[55],t[55];
void _inint(){for(int i=0;i<55;i++){for(int k=0;k<55;k++){if(i==k) mp[i][k] = 0;else mp[i][k] = INF;}}for(int i=0;i<55;i++){for(int k=0;k<1<<8;k++){///游览状态for(int j=0;j<1<<8;j++){dp[i][k][j] = INF;}}}memset(f,0,sizeof(f));dp[1][0][0] = 0;///初始状态
}
int main()
{int cas = 0;int T;scanf("%d",&T);while(T--){_inint();read(n);read(m);read(p);for(int i=1;i<=m;i++){ll x,y,w;read(x);read(y);read(w);mp[x][y] = min(mp[x][y],w);mp[y][x] = min(mp[y][x],w);}for(int i=1;i<=n;i++)for(int k=1;k<=n;k++)for(int j=1;j<=n;j++)mp[k][j] = min(mp[k][i]+mp[i][j],mp[k][j]);for(int i=0;i<p;i++){int x;scanf("%d%d%d%d",&pos[i],&t[i],&ft[i],&x);while(x--){ll y;read(y);f[y] |= 1<<i;}}ll ans = INF;for(int i=0;i<(1<<p);i++){///访问景点for(int k=0;k<(1<<p);k++){///门票for(int j=1;j<=n;j++){if(dp[j][i][k] != INF){if(i == ((1<<p)-1)) ans = min(ans,dp[j][i][k]+mp[j][1]);for(int aim=0;aim<p;aim++){if((i&(1<<aim)) == 0){///没去过if(k&(1<<aim)) ///有门票dp[pos[aim]][i^(1<<aim)][k|f[pos[aim]]] = min(dp[pos[aim]][i^(1<<aim)][k|f[pos[aim]]],dp[j][i][k]+mp[j][pos[aim]]+ft[aim]);else dp[pos[aim]][i^(1<<aim)][k|f[pos[aim]]] =min(dp[pos[aim]][i^(1<<aim)][k|f[pos[aim]]],dp[j][i][k]+mp[j][pos[aim]]+t[aim]);}}///不去游玩 到处跑for(int aim=1;aim<=n;aim++){dp[aim][i][k|f[aim]] = min(dp[aim][i][k|f[aim]],dp[j][i][k]+mp[aim][j]);}}}}}printf("Case #%d: %lld\n",++cas,ans);}return 0;
}
【LDU】 Week2自测 Disney‘s FastPass | 状压dp、Floyd相关推荐
- hdu 4114 Disney's FastPass 状压dp
点击打开链接 题意: 游戏园里有N个区域,有M条边连接这N个区域,有K个要访问的景点.对于每个景点告诉你这个景点所在的区域,要访问这个景点需要等待一定时间,如果没有FastPass,等待时间有Ti,否 ...
- HDU 4114 Disney's FastPass(状压dp)
题意就是给你一些点,有的地方有景区,有的地方有某些景点的优先票,拿优先票去景点和不拿的时间不一样.问从地点1出发去所有景点再回来的最短时间. 得把景点,景区进行状压.即dp[i][j][k]代表参观景 ...
- 【校内互测】Sunshine’s string(merge) (状压dp)
Sunshine's string(merge.cpp) [问题描述] 无聊的Sunshine大爷开始研究字符串.他找来了一个长度为n的01字符串,并制定了一些规则:每次可以将k个字符合并,得到一个新 ...
- 状压DP学习总结 (详解,适合没状压dp基础的人学习,还在更新中,,,,)
本次博客,主要是给学弟学妹们讲解一下状压dp,不适合有基础的同学观看,可能会浪费时间,因为偏基础 先来最简单的一个吧 http://acm.hdu.edu.cn/showproblem.php?p ...
- 刷题周记(九)——#状压DP:最短Hamilton路径、小国王(互不侵犯)、玉米田(Corn Fields G)、愤怒的小鸟、吃奶酪、炮兵阵地、宝藏 #区间DP:清空字符串#DP:关灯问题II
文章目录 --2020年12月20日(周日)------------------ 状压DP 一.最短Hamilton路径(模板题) 二.玉米田(P1879 [USACO06NOV]Corn Field ...
- POJ 1038 Bugs Integrated Inc (复杂的状压DP)
\(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...
- codeforces 8C. Looking for Order 状压dp
题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...
- UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)
整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...
- POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)
poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...
最新文章
- mysql带有OR关键字的多条件查询
- Authentication vs. Authorization 验证与授权[整理]
- python各种读取图像方法
- mysql 删除多余帐号_安装完mysql数据库后的优化(删除多余用户和数据库)
- leetcode 476. Number Complement | 476. 数字的补数(位运算)
- 图论--网络流最大流问题
- HttpClient 4 API –获取状态代码-getStatusLine()。getStatusCode()示例
- dynamic programming 学习
- L1-003. 个位数统计-PAT团体程序设计天梯赛GPLT
- 做任务云闪付为什么要实名认证_ISO9001质量体系认证:为什么要做?如何去做?...
- Kotlin从入门到放弃(三)——协程
- mysql数据类型及占用字节数
- 厦门大学继续教育计算机科学毕业难吗,厦门大学工资待遇
- Word文件没有保存怎么找回来?恢复文件
- 牛顿柯特斯公式及复合形式、龙贝格求积公式,高斯勒让德求积公式
- 手机开热点但是电脑一直连接不上_电脑连不上wifi,手机可以连上。手机开热点,电脑可以连上。这是怎么回事,电脑就一直循环连接那个w...
- android 5.1一键root工具箱,s大师一键root下载
- QLabel控件实现圆形头像显示
- 保险精算--第13周作业
- (附源码)基于PHP下的大学生校园交流论坛的设计与实现 毕业设计101634