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相关推荐

  1. BZOJ.3058.四叶草魔杖(Kruskal 状压DP)

    题目链接 \(2^{16}=65536\),可以想到状压DP.但是又有\(\sum A_i\neq 0\)的问题.. 但是\(2^n\)这么小,完全可以枚举所有子集找到\(\sum A_i=0\)的, ...

  2. BZOJ 3870: Our happy ending( 状压dp )

    dp(i, s)表示考虑了前i个数后, 能取到的数的集合为s时的方案数.对于1~min(L, K)枚举更新, 剩下的直接乘就好了. 复杂度O(T*K*2^N)...好像有点大, 但是可以AC.... ...

  3. bzoj 3055 礼物运送

    首先处理出两点之间最短路,设状态f[i][j]表示j状态下结尾为i的最短路,所以有转移f[i][j]=f[k][j|(1<<(k-1))]+dis[i][k]; 初状态就是f[i][(1& ...

  4. bzoj 2560: 串珠子【状压dp】

    正难则反,设g[s]为集合s不一定联通的方案数,这个很好求,把边数+1乘起来即可,f[s]为s一定联通的方案数 f考虑容斥,就是g[s]-Σf[nw]*g[s^nw],nw是s的子集,这样就减掉了不联 ...

  5. 【bzoj 2073】PRZ(状压DP)

    传送门biu~ 把当前过去了哪些人进行状态压缩,枚举当前状态走的最后一批人来转移. #include<bits/stdc++.h> #define inf 0x3f3f3f3f #defi ...

  6. bzoj3055 礼物运送(Floyd+状压dp)

    先Floyd预处理出两点间最短路径,然后状压dp,dp[s][i]表示状态为s的点都遍历了,停在i的最小时间.枚举一个j去转移就好了.然后处理出f[s],表示遍历了s状态的点的最小花费.然后枚举A遍历 ...

  7. BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4042 (Luogu) https://www.luogu.org/prob ...

  8. BZOJ 2073: [POI2004]PRZ( 状压dp )

    早上这道题没调完就去玩NOI网络同步赛了.... 状压dp , dp( s ) 表示 s 状态下所用的最短时间 , 转移就直接暴力枚举子集 . 可以先预处理出每个状态下的重量和时间的信息 . 复杂度是 ...

  9. 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP

    [题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...

最新文章

  1. javascript实现深克隆的几种方法
  2. ORACLE常用的动态性能视图
  3. 利用Phtoshop去掉图片中的线性渐变背景
  4. Handlebars模板库浅析
  5. JavaScript之match()方法讲解
  6. C#提取HTML代码中的文字(转)
  7. android系统换动画,Android Activity动画跳转修改
  8. ubuntu14.04换一个更快的源
  9. 字符串的模板 Manacher kmp ac自动机 后缀数组 后缀自动机
  10. Labview完全卸载工具msiblast NI
  11. PS2手柄移植-hal库
  12. AS--创建项目(慢)和打开项目(慢)等需要注意的问题
  13. 巴黎报纸对拿破仑的描述
  14. [JLOI2008]将军
  15. 手写识别文字软件有哪些?看完你就知道了
  16. 在CAD里怎么测量面积?
  17. JWT、JWS与JWE
  18. python与vba的区别_选择VBA还是Python?
  19. 饶天亮到访深圳时空梭,区块链技术与名人明星产业碰撞出新火花
  20. 美军用机器人将超士兵数量 10个机器人1名士兵

热门文章

  1. virtualbox和vagrant卸载脚本在macbook
  2. iOS imageview图片压缩变形
  3. CentOS 快速安装pip
  4. c#实现Socket网络编程
  5. 一个毕业生对大学爱情和奋斗的思考!
  6. 如何设置WebLogic生成的日志文件的权限?
  7. 22、《每天5分钟玩转Docker容器技术》学习--Flannel Network内部结构
  8. ubuntu 创建桌面快捷方式
  9. [转]你所不知的 CSS ::before 和 ::after 伪元素用法
  10. 选择 Reac​​tJS 的五大理由