[TJOI2019]大中锋的游乐场——最短路+DP
题目链接:
题目本质要求的还是最短路,但因为有第二维权值(汽水看成$+1$,汉堡看成$-1$)的限制,我们在最短路的基础上加上一维$f[i][j]$表示到达$i$节点,权值为$j$的最短路长度,然后像正常最短路那样转移,最后取终点所有状态的最小值即可。
- #include<set>
- #include<map>
- #include<queue>
- #include<stack>
- #include<cmath>
- #include<cstdio>
- #include<vector>
- #include<bitset>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- struct lty
- {
- int val,node,num;
- lty(int a,int b,int c){val=a,node=b,num=c;}
- };
- bool operator <(lty x,lty y){return x.val>y.val;}
- int f[10010][30];
- int head[10010];
- int val[200010];
- int v[10010];
- int to[200010];
- int next[200010];
- int n,m,k;
- int T;
- int tot;
- int a,b;
- int x,y,z;
- int vis[10010][30];
- priority_queue<lty>q;
- void add(int x,int y,int z)
- {
- next[++tot]=head[x];
- head[x]=tot;
- to[tot]=y;
- val[tot]=z;
- }
- void init()
- {
- memset(vis,0,sizeof(vis));
- memset(head,0,sizeof(head));
- tot=0;
- }
- void dijkstra(int S,int T)
- {
- for(int i=1;i<=n;i++)
- {
- for(int j=0;j<=2*k;j++)
- {
- f[i][j]=1<<30;
- }
- }
- f[S][k+v[S]]=0;
- q.push(lty(f[S][k+v[S]],S,k+v[S]));
- while(!q.empty())
- {
- lty now=q.top();
- q.pop();
- if(vis[now.node][now.num])
- {
- continue;
- }
- vis[now.node][now.num]=1;
- for(int i=head[now.node];i;i=next[i])
- {
- if(now.num+v[to[i]]<0||now.num+v[to[i]]>2*k)continue;
- if(f[to[i]][now.num+v[to[i]]]>f[now.node][now.num]+val[i])
- {
- f[to[i]][now.num+v[to[i]]]=f[now.node][now.num]+val[i];
- q.push(lty(f[to[i]][now.num+v[to[i]]],to[i],now.num+v[to[i]]));
- }
- }
- }
- int ans=1<<30;
- for(int i=0;i<=2*k;i++)
- {
- ans=min(ans,f[T][i]);
- }
- printf("%d",ans==(1<<30)?-1:ans);
- }
- void solve()
- {
- scanf("%d%d%d",&n,&m,&k);
- for(int i=1;i<=n;i++)
- {
- scanf("%d",&v[i]);
- if(v[i]==2)
- {
- v[i]=-1;
- }
- }
- for(int i=1;i<=m;i++)
- {
- scanf("%d%d%d",&x,&y,&z);
- add(x,y,z);
- add(y,x,z);
- }
- scanf("%d%d",&a,&b);
- dijkstra(a,b);
- }
- int main()
- {
- scanf("%d",&T);
- while(T--)
- {
- init();
- solve();
- }
- }
[TJOI2019]大中锋的游乐场——最短路+DP的更多相关文章
- 【题解】Luogu P5340 [TJOI2019]大中锋的游乐场
原题传送门 没想到省选也会出这种题??! 实际就是一个带有限制的最短路 因为\(k<=10\),所以我们珂以暴力将每个点的权值分为[-k,k],为了方便我们珂以转化成[0,2k],将汉堡的权值记 ...
- [洛谷P5340][TJOI2019]大中锋的游乐场
题目大意:有$n(n\leqslant10^4)$个点,$m(m\leqslant10^5)$条边的无向图,每个点有一个属性$A/B$,要求$|cnt_A-cnt_B|\leqslant k(k\le ...
- luogu P5340 [TJOI2019]大中锋的游乐场
传送门 要求经过路径汉堡的点和可乐的点个数之差绝对值\(\le k\),所以可以考虑dp,\(f_{i,j}\)表示到点\(i\),汉堡的点个数减可乐的点的个数为\(j\)的最短距离,注意一下负下标处 ...
- 「TJOI2019」大中锋的游乐场
题目链接 问题分析 比较明显的最短路模型.需要堆优化的dij.建图的时候注意细节就好. 参考程序 #include <bits/stdc++.h> #define LL long long ...
- [bzoj5511]大中锋的游乐场
记可乐为1,汉堡为-1,即求过程中绝对值不超过k的最短路. 然后发现k的范围仅为10,也就是说过程中合法的值仅有21种,因此跑一遍dij或spfa(嘿嘿嘿)即可. 1 #include<bits ...
- [TJOI2019]甲苯先生和大中锋的字符串——后缀自动机+差分
题目链接: [TJOI2019]甲苯先生和大中锋的字符串 对原串建后缀自动机并维护$parent$树上每个点的子树大小,显然子树大小为$k$的节点所代表的子串出现过$k$次,那么我们需要将$[len[ ...
- 洛谷P5341 [TJOI2019]甲苯先生和大中锋的字符串
原题链接P5341 [TJOI2019]甲苯先生和大中锋的字符串 题目描述 大中锋有一个长度为 n 的字符串,他只知道其中的一个子串是祖上传下来的宝藏的密码.但是由于字符串很长,大中锋很难将这些子串一 ...
- [USACO07NOV]牛继电器Cow Relays (最短路,DP)
题目链接 Solution 非正解 似乎比较蛇啊,先个一个部分分做法,最短路+\(DP\). 在求最短路的堆或者队列中存储元素 \(dis_{i,j}\) 代表 \(i\) 这个节点,走了 \(j\) ...
- bzoj1003物流运输 最短路+DP
bzoj1003物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输 ...
随机推荐
- centos安装配置jdk
本文以jdk8为例. 1.下载安装包 1.1.官网:https://www.oracle.com/technetwork/java/javase/downloads/index.html 1.2.登录 ...
- 用python爬取豆瓣电影Top 250
首先,打开豆瓣电影Top 250,然后进行网页分析.找到它的Host和User-agent,并保存下来. 然后,我们通过翻页,查看各页面的url,发现规律: 第一页:https://movie.dou ...
- Thinkphp中的assign() 和 display()
说到 $this->assign() 与 $this->display()想必用过TP框架的都不陌生,那么今天我们就来说说他们的作用及其他用法. 先说 $this->assign( ...
- 如何在SAP云平台ABAP编程环境里把CDS view暴露成OData服务
Jerry 2016年在学习SAP CDS view时,曾经写过一个CDS view的自学系列,其中有一篇提到了一个很方便的注解: @OData.publish: true 加上这个注解的CDS vi ...
- SAP Leonardo图片处理相关的机器学习服务在SAP智能服务场景中的应用
本文作为Jerry最近正在做的一个项目的工作思路的梳理. 我们假设这样一个服务场景,技师上门维修某设备,发现设备上某零件损坏了,假设这位技师由于种种原因,没能根据自己的经验识别出这个零件的型号.此时技 ...
- web框架(1)-搭建开发环境
一.python安装 首先,确认系统安装的Python版本 $ python3 -V Python 3.6.3 未安装python,请转至:python安装 二.安装第三方依赖库 1.异步框架aioh ...
- C#为什么要装箱和拆箱
来自论坛4楼的回答非常棒,地址:https://bbs.csdn.net/topics/390624164?page=1 内容如下: 道理很简单,按理说C#被设计成一种完全面向对象的语言.因此,包括数 ...
- CentOS 7中调整默认开启终端数量
#vim /etc/securetty #然后将不需要使用到的进行注释掉就可以了 就这么简单,在强大的百度上找了半天愣是没找到
- pyhton中map和reduce
from functools import reduce import numpy as np ''' reduce[function, sequence[, initial]]使用 1.functi ...
- php守护进程创建和简要分析
守护进程可 由系统启动脚本 /etc/rc.local crontab任务, 用户shell 方式运行 具体概念可参考c的 进程守护化基本步骤 1.创建子进程,终止父进程 (pcntl_fork,ex ...