首页 > 其他分享 >洛谷 P5340 大中锋的游乐场

洛谷 P5340 大中锋的游乐场

时间:2024-09-04 19:38:07浏览次数:5  
标签:tot 洛谷 int 中锋 vis state P5340 ver dis

洛谷 P5340 大中锋的游乐场

题意

给出一张 \(n\) 个点 \(m\) 条边的图,每个点有一个点权 \(1\) 或 \(-1\)。

给出点 \(s,t\),求出 \((s,t)\) 间满足以下条件的最短路。

任意时刻,走过的路径上点权和均 \(\in[-k,k]\)。

思路

分层图最短路。

\(dis_{i,j}\) 表示走到 \(i\),点权和为 \(j\) 的最短路。

跑一遍 dijkstra,顺便转移即可。

将点权全部加 \(k\) 方便数组存储。

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int ver[N << 1], nxt[N << 1], head[N], edge[N << 1], tot;
int n, m, k, s, t, dis[N][22], a[N];
bool vis[N][25];
struct node {int x, y, d;};
bool operator < (node A, node B) {return A.d > B.d;}
priority_queue <node> Q;
void add(int x, int y, int z) {
	ver[++ tot] = y;
	nxt[tot] = head[x];
	head[x] = tot;
	edge[tot] = z;
}
void solve() {
	cin >> n >> m >> k;
	for (int i = 1; i <= n; i ++) {
		cin >> a[i];
		if (a[i] == 2) a[i] = -1;
	}
	for (int i = 1, u, v, w; i <= m; i ++) {
		cin >> u >> v >> w;
		add(u, v, w);
		add(v, u, w);
	}
	cin >> s >> t;
	memset(dis, 0x3f, sizeof(dis));
	memset(vis, 0, sizeof(vis));
	dis[s][k + a[s]] = 0;
	Q.push({s, k + a[s], 0});
	while (!Q.empty()) {
		int x = Q.top().x, y = Q.top().y; Q.pop();
		if (vis[x][y]) continue;
		vis[x][y] = 1;
		for (int i = head[x]; i; i = nxt[i]) {
			int to = ver[i]; int state = y + a[to];
			if (state < 0 || state > 2 * k) continue;
			if (dis[to][state] > dis[x][y] + edge[i]) {
				dis[to][state] = dis[x][y] + edge[i];
				Q.push({to, state, dis[to][state]});
			}
		}
	}
	int ans = 0x3f3f3f3f;
	for (int i = 0; i <= 2 * k; i ++)
		ans = min(ans, dis[t][i]);
	if (ans == 0x3f3f3f3f) ans = -1;
	cout << ans << "\n";
}
int main() {
	int T;
	cin >> T;
	while (T --) 
		solve();
	return 0;
}

标签:tot,洛谷,int,中锋,vis,state,P5340,ver,dis
From: https://www.cnblogs.com/maniubi/p/18397225

相关文章

  • 洛谷 P5618 堵塞的交通
    洛谷P5618堵塞的交通题意有一个\(2\timesC\)的网格图,需要维护\(3\)种操作。连接相邻的两个格子。将相邻的两个格子断开连接。询问两个格子是否联通。思路1考虑分块。连边时块内使用并查集维护,块与块之间用数组标记。删边块内的边时暴力重构并查集,块之间的边清零......
  • 洛谷 B3645 数列前缀和 2 题解
    前缀知识:枚举,费马小定理,逆元,线性乘法逆元,线段树(?)。解法1:暴力如题。暴力枚举即可,30分。由于太简单,不给代码。解法2:前缀积+费马小定理+逆元由于涉及静态区间,可以想到前缀积。前缀积公式为\(q_r/q_{l-1}\),除法恰好可以用逆元来算。直接写即可。不会超时,因为时间为\(O(n\logp)\)......
  • 洛谷题单指南-常见优化技巧-P3143 [USACO16OPEN] Diamond Collector S
    原题链接:https://www.luogu.com.cn/problem/P3143题意解读:找到两个不相交的最长连续序列,使得序列最大值和最小值差不超过k,求两个最长的序列长度和。解题思路:先将所有数从小到大排序,记为a[]要找到两个不相交的最长连续序列,可以采用下面技巧:设b[i]表示i之前“差值在k之内的连续......
  • 洛谷题单指南-常见优化技巧-P4653 [CEOI2017] Sure Bet
    原题链接:https://www.luogu.com.cn/problem/P4653题意解读:选中的灯泡中,某一类较少的总权值减去灯泡数量所得到的收益最大值。解题思路:注意,此题关键是:要使得较少的收益最大化1、要最大化,意味着每次应该选择尽可能大权值的灯泡2、要使A、B类中较少的收益最大化,意味着每次应该优......
  • 洛谷题单指南-常见优化技巧-唯一的雪花 Unique Snowflakes
    原题链接:https://www.luogu.com.cn/problem/UVA11572题意解读:本质上是要计算最长连续不重复子序列的长度,典型的双指针应用。解题思路:通过双指针来枚举子序列,右指针指向的元素每次记录元素出现的次数,可以借助hash数组h[]如果枚举到的元素出现次数超过1,则表示左、右指针之间的子......
  • 洛谷题单指南-常见优化技巧-P2216 [HAOI2007] 理想的正方形
    原题链接:https://www.luogu.com.cn/problem/P2216题意解读:在矩阵中找n*n正方形里最大值和最小值差值的最小值。解题思路:1、枚举法直接枚举所有n*n的正方形的位置,然后在遍历求最大值、最小值,复杂度为O(n^4),显然不能通过。2、二维单调队列既然是求正方形范围内的最值,看起来是......
  • 洛谷题单指南-常见优化技巧-P2032 扫描
    原题链接:https://www.luogu.com.cn/problem/P2032题意解读:求滑动窗口内的最大值,典型的单调队列应用。解题思路:单调队列的三部曲:1、去头。已存入的元素个数超过k,则去头。注意队列里存的是元素下标,只需要用当前下标减去队头元素来判断即可。2、去尾。根据单调队列的单调性,如果......
  • 洛谷 P4819 杀人游戏
    洛谷P4819杀人游戏题意有\(n\)个人,他们之中有一个杀手。每个人都有可能是杀手,并且概率相等。你可以询问若干人。若询问的人是杀手,你会被干掉。若询问的人是平民,你会知道他认识的所有人的身份。给出一张有向图表示这\(n\)个人的关系。求出你活着知道杀手是谁的概率。......
  • 洛谷 P3225 矿场搭建
    洛谷P3225矿场搭建题意煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖煤点的工人都有一条道路通向救援出口。请......
  • 洛谷 P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
    题目大意小A和小B,要进行\(N\)次猜拳,每次按照一定周期出拳,胜负情况如下:求出小A和小B分别赢了几次。思路枚举\(N\)次猜拳,每次比较\(a[powera]\)与\(b[powerb]\)(poewra与powerb是a和b数组的索引,详见代码)。CODE#include<bits/stdc++.h>usingnamespacestd;in......