题目链接:

[TJOI2019]大中锋的游乐场

题目本质要求的还是最短路,但因为有第二维权值(汽水看成$+1$,汉堡看成$-1$)的限制,我们在最短路的基础上加上一维$f[i][j]$表示到达$i$节点,权值为$j$的最短路长度,然后像正常最短路那样转移,最后取终点所有状态的最小值即可。

  1. #include<set>
  2. #include<map>
  3. #include<queue>
  4. #include<stack>
  5. #include<cmath>
  6. #include<cstdio>
  7. #include<vector>
  8. #include<bitset>
  9. #include<cstring>
  10. #include<iostream>
  11. #include<algorithm>
  12. using namespace std;
  13. struct lty
  14. {
  15. int val,node,num;
  16. lty(int a,int b,int c){val=a,node=b,num=c;}
  17. };
  18. bool operator <(lty x,lty y){return x.val>y.val;}
  19. int f[10010][30];
  20. int head[10010];
  21. int val[200010];
  22. int v[10010];
  23. int to[200010];
  24. int next[200010];
  25. int n,m,k;
  26. int T;
  27. int tot;
  28. int a,b;
  29. int x,y,z;
  30. int vis[10010][30];
  31. priority_queue<lty>q;
  32. void add(int x,int y,int z)
  33. {
  34. next[++tot]=head[x];
  35. head[x]=tot;
  36. to[tot]=y;
  37. val[tot]=z;
  38. }
  39. void init()
  40. {
  41. memset(vis,0,sizeof(vis));
  42. memset(head,0,sizeof(head));
  43. tot=0;
  44. }
  45. void dijkstra(int S,int T)
  46. {
  47. for(int i=1;i<=n;i++)
  48. {
  49. for(int j=0;j<=2*k;j++)
  50. {
  51. f[i][j]=1<<30;
  52. }
  53. }
  54. f[S][k+v[S]]=0;
  55. q.push(lty(f[S][k+v[S]],S,k+v[S]));
  56. while(!q.empty())
  57. {
  58. lty now=q.top();
  59. q.pop();
  60. if(vis[now.node][now.num])
  61. {
  62. continue;
  63. }
  64. vis[now.node][now.num]=1;
  65. for(int i=head[now.node];i;i=next[i])
  66. {
  67. if(now.num+v[to[i]]<0||now.num+v[to[i]]>2*k)continue;
  68. if(f[to[i]][now.num+v[to[i]]]>f[now.node][now.num]+val[i])
  69. {
  70. f[to[i]][now.num+v[to[i]]]=f[now.node][now.num]+val[i];
  71. q.push(lty(f[to[i]][now.num+v[to[i]]],to[i],now.num+v[to[i]]));
  72. }
  73. }
  74. }
  75. int ans=1<<30;
  76. for(int i=0;i<=2*k;i++)
  77. {
  78. ans=min(ans,f[T][i]);
  79. }
  80. printf("%d",ans==(1<<30)?-1:ans);
  81. }
  82. void solve()
  83. {
  84. scanf("%d%d%d",&n,&m,&k);
  85. for(int i=1;i<=n;i++)
  86. {
  87. scanf("%d",&v[i]);
  88. if(v[i]==2)
  89. {
  90. v[i]=-1;
  91. }
  92. }
  93. for(int i=1;i<=m;i++)
  94. {
  95. scanf("%d%d%d",&x,&y,&z);
  96. add(x,y,z);
  97. add(y,x,z);
  98. }
  99. scanf("%d%d",&a,&b);
  100. dijkstra(a,b);
  101. }
  102. int main()
  103. {
  104. scanf("%d",&T);
  105. while(T--)
  106. {
  107. init();
  108. solve();
  109. }
  110. }

[TJOI2019]大中锋的游乐场——最短路+DP的更多相关文章

  1. 【题解】Luogu P5340 [TJOI2019]大中锋的游乐场

    原题传送门 没想到省选也会出这种题??! 实际就是一个带有限制的最短路 因为\(k<=10\),所以我们珂以暴力将每个点的权值分为[-k,k],为了方便我们珂以转化成[0,2k],将汉堡的权值记 ...

  2. [洛谷P5340][TJOI2019]大中锋的游乐场

    题目大意:有$n(n\leqslant10^4)$个点,$m(m\leqslant10^5)$条边的无向图,每个点有一个属性$A/B$,要求$|cnt_A-cnt_B|\leqslant k(k\le ...

  3. luogu P5340 [TJOI2019]大中锋的游乐场

    传送门 要求经过路径汉堡的点和可乐的点个数之差绝对值\(\le k\),所以可以考虑dp,\(f_{i,j}\)表示到点\(i\),汉堡的点个数减可乐的点的个数为\(j\)的最短距离,注意一下负下标处 ...

  4. 「TJOI2019」大中锋的游乐场

    题目链接 问题分析 比较明显的最短路模型.需要堆优化的dij.建图的时候注意细节就好. 参考程序 #include <bits/stdc++.h> #define LL long long ...

  5. [bzoj5511]大中锋的游乐场

    记可乐为1,汉堡为-1,即求过程中绝对值不超过k的最短路. 然后发现k的范围仅为10,也就是说过程中合法的值仅有21种,因此跑一遍dij或spfa(嘿嘿嘿)即可. 1 #include<bits ...

  6. [TJOI2019]甲苯先生和大中锋的字符串——后缀自动机+差分

    题目链接: [TJOI2019]甲苯先生和大中锋的字符串 对原串建后缀自动机并维护$parent$树上每个点的子树大小,显然子树大小为$k$的节点所代表的子串出现过$k$次,那么我们需要将$[len[ ...

  7. 洛谷P5341 [TJOI2019]甲苯先生和大中锋的字符串

    原题链接P5341 [TJOI2019]甲苯先生和大中锋的字符串 题目描述 大中锋有一个长度为 n 的字符串,他只知道其中的一个子串是祖上传下来的宝藏的密码.但是由于字符串很长,大中锋很难将这些子串一 ...

  8. [USACO07NOV]牛继电器Cow Relays (最短路,DP)

    题目链接 Solution 非正解 似乎比较蛇啊,先个一个部分分做法,最短路+\(DP\). 在求最短路的堆或者队列中存储元素 \(dis_{i,j}\) 代表 \(i\) 这个节点,走了 \(j\) ...

  9. bzoj1003物流运输 最短路+DP

    bzoj1003物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输 ...

随机推荐

  1. centos安装配置jdk

    本文以jdk8为例. 1.下载安装包 1.1.官网:https://www.oracle.com/technetwork/java/javase/downloads/index.html 1.2.登录 ...

  2. 用python爬取豆瓣电影Top 250

    首先,打开豆瓣电影Top 250,然后进行网页分析.找到它的Host和User-agent,并保存下来. 然后,我们通过翻页,查看各页面的url,发现规律: 第一页:https://movie.dou ...

  3. Thinkphp中的assign() 和 display()

    说到 $this->assign()  与 $this->display()想必用过TP框架的都不陌生,那么今天我们就来说说他们的作用及其他用法. 先说 $this->assign( ...

  4. 如何在SAP云平台ABAP编程环境里把CDS view暴露成OData服务

    Jerry 2016年在学习SAP CDS view时,曾经写过一个CDS view的自学系列,其中有一篇提到了一个很方便的注解: @OData.publish: true 加上这个注解的CDS vi ...

  5. SAP Leonardo图片处理相关的机器学习服务在SAP智能服务场景中的应用

    本文作为Jerry最近正在做的一个项目的工作思路的梳理. 我们假设这样一个服务场景,技师上门维修某设备,发现设备上某零件损坏了,假设这位技师由于种种原因,没能根据自己的经验识别出这个零件的型号.此时技 ...

  6. web框架(1)-搭建开发环境

    一.python安装 首先,确认系统安装的Python版本 $ python3 -V Python 3.6.3 未安装python,请转至:python安装 二.安装第三方依赖库 1.异步框架aioh ...

  7. C#为什么要装箱和拆箱

    来自论坛4楼的回答非常棒,地址:https://bbs.csdn.net/topics/390624164?page=1 内容如下: 道理很简单,按理说C#被设计成一种完全面向对象的语言.因此,包括数 ...

  8. CentOS 7中调整默认开启终端数量

    #vim /etc/securetty #然后将不需要使用到的进行注释掉就可以了 就这么简单,在强大的百度上找了半天愣是没找到

  9. pyhton中map和reduce

    from functools import reduce import numpy as np ''' reduce[function, sequence[, initial]]使用 1.functi ...

  10. php守护进程创建和简要分析

    守护进程可 由系统启动脚本 /etc/rc.local crontab任务, 用户shell 方式运行 具体概念可参考c的 进程守护化基本步骤 1.创建子进程,终止父进程 (pcntl_fork,ex ...