bzoj 3055礼物运送 floyed + 状压DP
bzoj 3055: 礼物运送
floyed first 设f[i][S]表示取到了S集合中的所有点(不一定是经过的所有点),最后停在了i的最优值。
初始就f[i][{i}] = dis[1][i]
状态转移直接转就好了
f[i][S] + dis[i][j] -> f[j][S + {j}]其中 i 属于 S,1 <= j <= n
设tim[S] = min{f[i][S]}
答案就取到
ans = min{max{tim[S],tim[Cs]}}
1 #include <map> 2 #include <queue> 3 #include <cstdio> 4 #include <cstring> 5 #include <climits> 6 #include <algorithm> 7 using namespace std; 8 inline void read(int &x){ 9 x=0;char ch;bool flag = false; 10 while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true; 11 while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x; 12 } 13 inline int cat_min(const int &a,const int &b){return a<b ? a:b;} 14 inline int cat_max(const int &a,const int &b){return a>b ? a:b;} 15 inline int cat_abs(const int &x){return x < 0 ? -x : x;} 16 const int maxn = 19; 17 const int maxs = (1<<19) + 1; 18 int dis[maxn][maxn],n,f[maxn][maxs],tim[maxs]; 19 inline void init(){ 20 memset(dis,0x3f,sizeof dis); 21 memset(f,0x3f,sizeof f); 22 memset(tim,0x3f,sizeof tim); 23 } 24 void floyed(){ 25 for(int i=1;i<=n;++i){ 26 dis[i][i] = 0; 27 for(int j=1;j<=n;++j){ 28 if(i == j) continue; 29 for(int k=1;k<=n;++k){ 30 dis[i][j] = cat_min(dis[i][j], 31 dis[i][k] + dis[k][j]); 32 } 33 } 34 }return; 35 } 36 map<int,int>ma; 37 int main(){ 38 39 int m;read(n);read(m); 40 init(); 41 for(int i=1,u,v,d;i<=m;++i){ 42 read(u);read(v);read(d); 43 if(dis[u][v] > d) dis[u][v] = dis[v][u] = d; 44 } 45 floyed(); 46 for(int i=0;i<=18;++i) ma[1<<i] = i+1; 47 for(int i=1;i<=n;++i) f[i][(1<<0) | (1<<(i-1))] = dis[1][i]; 48 for(int i=0,x=0;i<(1<<n);x = (++i) ){ 49 while(x){ 50 int p = ma[x&-x];x -=x&-x; 51 for(int j=1;j<=n;++j){ 52 if( f[j][i | (1<<(j-1))] > f[p][i] + dis[p][j]){ 53 f[j][i | (1<<(j-1))] = f[p][i] + dis[p][j]; 54 } 55 } 56 } 57 } 58 for(int i=0,x=0;i<(1<<n);x = (++i) ){ 59 while(x){ 60 int p = ma[x & -x];x -= x&-x; 61 tim[i]=cat_min(tim[i],f[p][i]); 62 } 63 } 64 int ans = 0x7f7f7f7f; 65 for(int i=0;i<(1<<n);++i){ 66 ans = cat_min(ans,cat_max(tim[i], 67 tim[1 | (( (1 << n)-1 )^i) ])); 68 }printf("%d\n",ans); 69 //getchar();getchar(); 70 fclose(stdin);fclose(stdout); 71 return 0; 72 }
转载于:https://www.cnblogs.com/Skyminer/p/6023156.html
bzoj 3055礼物运送 floyed + 状压DP相关推荐
- BZOJ.3058.四叶草魔杖(Kruskal 状压DP)
题目链接 \(2^{16}=65536\),可以想到状压DP.但是又有\(\sum A_i\neq 0\)的问题.. 但是\(2^n\)这么小,完全可以枚举所有子集找到\(\sum A_i=0\)的, ...
- BZOJ 3870: Our happy ending( 状压dp )
dp(i, s)表示考虑了前i个数后, 能取到的数的集合为s时的方案数.对于1~min(L, K)枚举更新, 剩下的直接乘就好了. 复杂度O(T*K*2^N)...好像有点大, 但是可以AC.... ...
- bzoj 3055 礼物运送
首先处理出两点之间最短路,设状态f[i][j]表示j状态下结尾为i的最短路,所以有转移f[i][j]=f[k][j|(1<<(k-1))]+dis[i][k]; 初状态就是f[i][(1& ...
- bzoj 2560: 串珠子【状压dp】
正难则反,设g[s]为集合s不一定联通的方案数,这个很好求,把边数+1乘起来即可,f[s]为s一定联通的方案数 f考虑容斥,就是g[s]-Σf[nw]*g[s^nw],nw是s的子集,这样就减掉了不联 ...
- 【bzoj 2073】PRZ(状压DP)
传送门biu~ 把当前过去了哪些人进行状态压缩,枚举当前状态走的最后一批人来转移. #include<bits/stdc++.h> #define inf 0x3f3f3f3f #defi ...
- bzoj3055 礼物运送(Floyd+状压dp)
先Floyd预处理出两点间最短路径,然后状压dp,dp[s][i]表示状态为s的点都遍历了,停在i的最小时间.枚举一个j去转移就好了.然后处理出f[s],表示遍历了s状态的点的最小花费.然后枚举A遍历 ...
- BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4042 (Luogu) https://www.luogu.org/prob ...
- BZOJ 2073: [POI2004]PRZ( 状压dp )
早上这道题没调完就去玩NOI网络同步赛了.... 状压dp , dp( s ) 表示 s 状态下所用的最短时间 , 转移就直接暴力枚举子集 . 可以先预处理出每个状态下的重量和时间的信息 . 复杂度是 ...
- 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP
[题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...
最新文章
- javascript实现深克隆的几种方法
- ORACLE常用的动态性能视图
- 利用Phtoshop去掉图片中的线性渐变背景
- Handlebars模板库浅析
- JavaScript之match()方法讲解
- C#提取HTML代码中的文字(转)
- android系统换动画,Android Activity动画跳转修改
- ubuntu14.04换一个更快的源
- 字符串的模板 Manacher kmp ac自动机 后缀数组 后缀自动机
- Labview完全卸载工具msiblast NI
- PS2手柄移植-hal库
- AS--创建项目(慢)和打开项目(慢)等需要注意的问题
- 巴黎报纸对拿破仑的描述
- [JLOI2008]将军
- 手写识别文字软件有哪些?看完你就知道了
- 在CAD里怎么测量面积?
- JWT、JWS与JWE
- python与vba的区别_选择VBA还是Python?
- 饶天亮到访深圳时空梭,区块链技术与名人明星产业碰撞出新火花
- 美军用机器人将超士兵数量 10个机器人1名士兵
热门文章
- virtualbox和vagrant卸载脚本在macbook
- iOS imageview图片压缩变形
- CentOS 快速安装pip
- c#实现Socket网络编程
- 一个毕业生对大学爱情和奋斗的思考!
- 如何设置WebLogic生成的日志文件的权限?
- 22、《每天5分钟玩转Docker容器技术》学习--Flannel Network内部结构
- ubuntu 创建桌面快捷方式
- [转]你所不知的 CSS ::before 和 ::after 伪元素用法
- 选择 Reac​​tJS 的五大理由