luogu P5340 [TJOI2019]大中锋的游乐场
要求经过路径汉堡的点和可乐的点个数之差绝对值\(\le k\),所以可以考虑dp,\(f_{i,j}\)表示到点\(i\),汉堡的点个数减可乐的点的个数为\(j\)的最短距离,注意一下负下标处理,然后跑个dij就完事了
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<cmath>
#include<ctime>
#include<queue>
#include<map>
#include<set>
#define LL long long
#define db double
using namespace std;
const int N=1e4+10,M=1e5+10,mod=998244353;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int to[M<<1],nt[M<<1],w[M<<1],hd[N],tot;
void add(int x,int y,int z)
{
++tot,to[tot]=y,nt[tot]=hd[x],w[tot]=z,hd[x]=tot;
++tot,to[tot]=x,nt[tot]=hd[y],w[tot]=z,hd[y]=tot;
}
int n,m,kk,a[N];
LL di[N][21];
struct node
{
int x,k;
LL d;
bool operator < (const node &bb) const {return d>bb.d;}
};
priority_queue<node> q;
int main()
{
int T=rd();
while(T--)
{
n=rd(),m=rd(),kk=rd();
for(int i=1;i<=n;++i) a[i]=rd()&1?-1:1;
memset(hd,0,sizeof(hd)),tot=1;
while(m--)
{
int x=rd(),y=rd(),z=rd();
add(x,y,z);
}
memset(di,0x3f,sizeof(di));
int ps=rd(),pt=rd();
if(kk+a[ps]>=0&&kk+a[ps]<=kk+kk)
q.push((node){ps,kk+a[ps],di[ps][kk+a[ps]]=0});
while(!q.empty())
{
int x=q.top().x,k=q.top().k;
LL d=q.top().d;
q.pop();
if(d>di[x][k]) continue;
for(int i=hd[x];i;i=nt[i])
{
int y=to[i],nk=k+a[y];
if(nk>=0&&nk<=kk+kk&&di[y][nk]>di[x][k]+w[i])
q.push((node){y,nk,di[y][nk]=di[x][k]+w[i]});
}
}
LL ans=1ll<<50;
for(int i=0;i<=kk+kk;++i) ans=min(ans,di[pt][i]);
ans<(1ll<<50)?printf("%lld\n",ans):puts("-1");
}
return 0;
}
luogu P5340 [TJOI2019]大中锋的游乐场的更多相关文章
- 【题解】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 ...
- [TJOI2019]大中锋的游乐场——最短路+DP
题目链接: [TJOI2019]大中锋的游乐场 题目本质要求的还是最短路,但因为有第二维权值(汽水看成$+1$,汉堡看成$-1$)的限制,我们在最短路的基础上加上一维$f[i][j]$表示到达$i$节 ...
- 「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 的字符串,他只知道其中的一个子串是祖上传下来的宝藏的密码.但是由于字符串很长,大中锋很难将这些子串一 ...
- luogu P5341 [TJOI2019]甲苯先生和大中锋的字符串
传送门 考虑子串以及出现个数,可以发现SAM可以快速知道每种子串的出现次数,即所在状态的\(endpos\)集合大小,然后一个状态对应的子串长度是一段连续区间,所以可以对每个状态差分一下,就能统计答案 ...
- 【题解】Luogu P5341 [TJOI2019]甲苯先生和大中锋的字符串
原题传送门 实际按照题意模拟就行 我们先求出字符串的sa 因为要在字符串中出现k次,所以我们枚举\(l,r(r-l+1=k)\)看一共有多少种合法的方案 合法方案的长度下界\(lb\)为\(Max(h ...
随机推荐
- UML——概述
1. 静态视图(类图) 静态视图不描述与时间相关的系统行为,这种行为在其他视图中描述,因此称之为静态试图. 静态视图用类图来实现,正因为它以类图为中心,因此也称之为类图. ...
- 【C++】char* 和 char[] 区别的理解
string 是一个类,其中有一个 char * 类型的私有变量. 因此可以如下构建一个string类型的变量. string str = "abcd"; 其中,右值“abcd”一 ...
- JMS学习十(ActiveMQ支持的传输协议)
ActiveMQ提供了一种连接机制,这种连接机制使用传输连接器(TransportConnector)实现客户端与代理(client - to - broker)之间的通信. 网络连接器(networ ...
- WINDOWS API 大全(二)
9. API之设备场景函数 CombineRgn 将两个区域组合为一个新区域CombineTransform 驱动世界转换.它相当于依顺序进行两次转换CreateCompatibleDC 创建一个与特 ...
- Bader分析
一.背景 理查德·贝德(Richard Bader)开发了一种将分子分解为原子的直观方法.他对原子的定义纯粹基于电子电荷密度.Bader使用所谓的零磁通表面来划分原子.零通量表面是2D表面,其上电荷密 ...
- 【mysql】查询最新的10条记录
实现查询最新10条数据方法: select * from 表名 order by id(主键) desc limit 10 参考文档: MySQL查询后10条数据并顺序输出
- Python子类调用父类内属性的方法
常见的就是初始化方法__init__() python中类的初始化方法是__init__(),因此父类子类的初始化方法都是这个,如果子类不实现这个函数,初始化时调用父类的初始化函数,如果子类实现这个函 ...
- CSS3——对齐 组合选择符 伪类 伪元素 导航栏 下拉菜单
水平&垂直对齐 元素居中对齐 .center { margin: auto; width: 50%; border: 3px solid green; padding: 10px; } 文本 ...
- 2.proxychains----Macchanger----anonsurf
nano /etc/proxychains.conf 激活dynamic_chain 同是启用proxy_dns 只启用IP会泄露DNS位置信息,别人就知道你在用匿名 ipconfig ifco ...
- HashMap源码分析-jdk1.7
注:转载请注明出处!!!!!!!这里咱们看的是JDK1.7版本的HashMap 学习HashMap前先知道熟悉运算符合 *左移 << :就是该数对应二进制码整体左移,左边超出的部分舍弃,右 ...