[洛谷P5340][TJOI2019]大中锋的游乐场
题目大意:有$n(n\leqslant10^4)$个点,$m(m\leqslant10^5)$条边的无向图,每个点有一个属性$A/B$,要求$|cnt_A-cnt_B|\leqslant k(k\leqslant10)$,问$S\to T$最短路径
题解:把每个点拆成$2k+1$个点,分别标号为$[-k,k]$,表示到这$cnt_A-cnt_B$的值,跑最短路即可。
卡点:各种地方没有把$n$改成$n(2k+1)$
C++ Code:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#define maxn (10010 * 21)
#define maxm (100010 * 21) int head[maxn], cnt;
struct Edge {
int to, nxt, w;
} e[maxm << 1];
inline void addedge(int a, int b, int c) {
e[++cnt] = (Edge) { b, head[a], c }; head[a] = cnt;
} int n, m, k, K, S, T; namespace Graph {
int V[maxn << 2];
long long dis[maxn];
inline int getmin(int a, int b) { return dis[a] < dis[b] ? a : b; } void modify(int rt, int l, int r, int p, int num) {
if (l == r) {
V[rt] = num;
return ;
}
const int mid = l + r >> 1;
if (p <= mid) modify(rt << 1, l, mid, p, num);
else modify(rt << 1 | 1, mid + 1, r, p, num);
V[rt] = getmin(V[rt << 1], V[rt << 1 | 1]);
}
long long dijkstra(int S, int T) {
const int N = n * K + 1;
memset(dis, 0x3f, sizeof dis);
memset(V, 0, sizeof V);
dis[S] = 0, modify(1, 1, N, S, S);
for (int TIM = n * K + 1; TIM; --TIM) {
int u = V[1];
modify(1, 1, N, u, 0);
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (dis[v] > dis[u] + e[i].w) {
dis[v] = dis[u] + e[i].w;
modify(1, 1, N, v, v);
}
}
}
return dis[T];
}
} int TIM, w[maxn];
int main() {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
std::cin >> TIM;
while (TIM --> 0) {
std::cin >> n >> m >> k;
K = 2 * k + 1;
for (int i = 1, x; i <= n; ++i) std::cin >> x, w[i] = x - 1;
for (int i = 0, a, b, c; i < m; ++i) {
std::cin >> a >> b >> c;
--a, --b;
for (int j = 2; j <= K; ++j) {
if (w[b + 1]) addedge(a * K + j - 1, b * K + j, c);
else addedge(a * K + j, b * K + j - 1, c);
if (w[a + 1]) addedge(b * K + j - 1, a * K + j, c);
else addedge(b * K + j, a * K + j - 1, c);
}
}
std::cin >> S >> T;
--S, --T;
for (int j = 1; j <= K; ++j) addedge(T * K + j, n * K + 1, 0);
int St = S * K + k + 1;
if (w[S + 1]) ++St; else --St;
long long ans = Graph::dijkstra(St, n * K + 1);
std::cout << (ans == 0x3f3f3f3f3f3f3f3f ? -1 : ans) << '\n';
if (TIM) {
memset(head, 0, sizeof head);
cnt = 0;
}
}
return 0;
}
[洛谷P5340][TJOI2019]大中锋的游乐场的更多相关文章
- 【题解】Luogu P5340 [TJOI2019]大中锋的游乐场
原题传送门 没想到省选也会出这种题??! 实际就是一个带有限制的最短路 因为\(k<=10\),所以我们珂以暴力将每个点的权值分为[-k,k],为了方便我们珂以转化成[0,2k],将汉堡的权值记 ...
- luogu P5340 [TJOI2019]大中锋的游乐场
传送门 要求经过路径汉堡的点和可乐的点个数之差绝对值\(\le k\),所以可以考虑dp,\(f_{i,j}\)表示到点\(i\),汉堡的点个数减可乐的点的个数为\(j\)的最短距离,注意一下负下标处 ...
- [TJOI2019]大中锋的游乐场——最短路+DP
题目链接: [TJOI2019]大中锋的游乐场 题目本质要求的还是最短路,但因为有第二维权值(汽水看成$+1$,汉堡看成$-1$)的限制,我们在最短路的基础上加上一维$f[i][j]$表示到达$i$节 ...
- 洛谷 P1230 智力大冲浪
洛谷 P1230 智力大冲浪 题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?! ...
- 洛谷P5338 [TJOI2019]甲苯先生的滚榜
原题链接洛谷P5338 [TJOI2019]甲苯先生的滚榜 题目描述 甲苯先生在制作一个online judge,他发现做比赛的人们很关心自己的排名(显而易见),在acm赛制的比赛中,如果通过题目数量 ...
- 洛谷P5341 [TJOI2019]甲苯先生和大中锋的字符串
原题链接P5341 [TJOI2019]甲苯先生和大中锋的字符串 题目描述 大中锋有一个长度为 n 的字符串,他只知道其中的一个子串是祖上传下来的宝藏的密码.但是由于字符串很长,大中锋很难将这些子串一 ...
- 洛谷P3348 [ZJOI2016]大森林(LCT,虚点,树上差分)
洛谷题目传送门 思路分析 最简单粗暴的想法,肯定是大力LCT,每个树都来一遍link之类的操作啦(T飞就不说了) 考虑如何优化算法.如果没有1操作,肯定每个树都长一样.有了1操作,就来仔细分析一下对不 ...
- 「TJOI2019」大中锋的游乐场
题目链接 问题分析 比较明显的最短路模型.需要堆优化的dij.建图的时候注意细节就好. 参考程序 #include <bits/stdc++.h> #define LL long long ...
- AC日记——神奇的幻方 洛谷 P2615(大模拟)
题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...
随机推荐
- BZOJ 3435: [Wc2014]紫荆花之恋
二次联通门 : BZOJ 3435: [Wc2014]紫荆花之恋 二次联通门 : luogu P3920 [WC2014]紫荆花之恋 /* luogu P3920 [WC2014]紫荆花之恋 怀疑人生 ...
- 微信小程序地图组件
index.wxml <map id="map" markers="{{markers}}" longitude="{{longitude}}& ...
- shell脚本编程基础之while、for、until循环
while及until循环结构 while CONDITION:do statement done 进入循环:条件满足 退出循环:条件不满足 当需要命令的执行状态返回值时,可以直接把整个命令当做循环的 ...
- 《Java理解程序逻辑试题分析》
1.以下关于开发java程序的描述错误的是 (). (选择一项) A:开发Java程序的步骤包括:编写源程序.编译.运行 B:编写的Java源程序文件使用 java作为扩展名 C:Java源文件经编译 ...
- OpenFOAM——高空腔内的湍流自然对流
本算例来自<ANSYS Fluid Dynamics Verification Manual>中的VMFL052: Turbulent Natural Convection Inside ...
- rancher2.x的安装
docker run -d --restart=unless-stopped \-p 80:80 -p 443:443 \-v /var/lib/rancher:/var/lib/rancher/ ...
- (二)Cisco dhcp snooping配置解释
#配置dhcp snooping相关命令 Switch(config)#ip dhcp snooping //打开DHCP Snooping功能Switch(config)#ip dhcp snoo ...
- Java-Maven(十一):Maven 项目出现pom.xml错误:Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-compiler-plugin
Maven项目出现ERROR: eclipse更新了Maven插件后,让后就出现了以下错误: Description Resource Path Location Type Conflicting l ...
- JBoss服务器的安装和使用(关联到IDEA)
1. 下载安装jboss服务器 wildfly-16.0.0.Final.zip(更名为wildfly了,选择合适的版本) 2. 解压,配置环境变量. JBOSS_HOME=D:\Program Fi ...
- 屠龙术&平凡的世界
x 听过很多道理,却依然过不好这一生 小时候,总觉得世上肯定存在屠龙术.就像<倚天屠龙记>里面张无忌学的<乾坤大挪移>/<九阳真经>一般, 学会了就可以一人单挑光明 ...