题目链接:\(\texttt{Luogu P4524 Ceste}\)

简化题意

给定一个有 \(n\) 个点 \(m\) 条边的无向图。每条边的边权为一个二元组 \((a, b)\),求以 \(1\) 为原点的最短路。

其中 \(a\) 到 \(b\) 的路径权值记为 \(\sum{a} \times \sum{b}\) 。

题目分析

最短路。

考虑单源最短路(这里说的是 dijkstra )的步骤:找到一个有效的点 \(a\) ,然后对它周围的点进行遍历,如果满足三角不等式 (\(d_a + w_i < d_b\)),那么更新 \(b\) 且入优先队列。

但是对于这道题,我们发现,我们并不知道哪些点会满足三角形不等式。换言之,我们不知道当前这个点是否应该入队。但是我们可以发现下面的性质:

对于点 \(a\),设可以到达 \(a\) 的路径集合为 \(S\) ,当前有到 \(a\) 的路径长度 \((d_a, d_b)\)。

  1. \(\exists (S_a, S_b), S_a < d_a, S_b < d_b\),则 \((d_a, d_b)\) 一定不满足三角不等式。

  2. \(\forall(S_a, S_b), S_a > d_b, S_b > d_b\),则 \((d_a, d_b)\) 一定满足三角不等式。

这样,我们可以对每个点搞一个 set,在里面存上每个到这个点的路径权值。然后每当得到一个新的长度,就去里面查一查,看看满不满足即可。

感觉复杂度有点玄学,可能是因为数据太弱了。如果数据加强了,我立即删题解。

参考代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <ctime>
#include <set>
#define itset set<PLL>::iterator using namespace std; using LL = long long;
using PII = pair<int, int>;
using PLL = pair<LL, LL>; const int N = 2010, M = N << 1;
const LL INF = 1e12;
LL dist[N]; int n, m;
set<PLL> s[N];
bool st[N]; namespace Edges {
int h[N], e[M], ne[M], idx; PLL w[M];
void add(int a, int b, LL w1, LL w2) {
e[ ++ idx] = b, ne[idx] = h[a], h[a] = idx;
w[idx] = {w1, w2};
}
} using namespace Edges; struct Node {
int ver; LL a, b;
bool operator < (const Node &tmp)const {
return tmp.a * tmp.b < a * b;
}
}; bool check(int u, LL a, LL b) {
itset it = s[u].upper_bound({a, b});
if (it != s[u].begin()) {
it -- ;
if (it -> second < b) return false;
}
return true;
} void dij() {
priority_queue<Node, vector<Node>> q;
fill(dist + 1, dist + n + 1, INF);
s[1].insert({0, 0}); dist[1] = 0;
q.push({1, 0, 0}); while (q.size()) {
auto t = q.top(); q.pop();
int ver = t.ver, a = t.a, b = t.b; for (int i = h[ver]; i; i = ne[i]) {
int j = e[i];
if (!check(j, a + w[i].first, b + w[i].second)) continue;
s[j].insert({a + w[i].first, b + w[i].second});
dist[j] = min(dist[j], (a + w[i].first) * (b + w[i].second));
q.push({j, a + w[i].first, b + w[i].second});
}
}
} int main() {
scanf("%d%d", &n, &m);
while (m -- ) {
int a, b; LL w1, w2;
scanf("%d%d%lld%lld", &a, &b, &w1, &w2);
add(a, b, w1, w2), add(b, a, w1, w2);
} dij(); for (int i = 2; i <= n; i ++ )
printf("%lld\n", dist[i] == INF ? -1 : dist[i]); return 0;
}

Luogu P4524 Ceste 题解的更多相关文章

  1. 【luogu P3946 ことりのおやつ】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3946 交好几遍是因为虽然能过一直有提醒..强迫症qwq #include <bits/stdc++.h ...

  2. Luogu P2210 Haywire 题解

    其实这题吧...有一种玄学解法 这题的要求的就是一个最小化的顺序 那么,我们就不进想到了一种显然的写法 就是random_shuffle 什么?这不是乱搞的非正解吗 然而,正如一句话说的好 一个算法, ...

  3. [Luogu P4178]Tree 题解(点分治+平衡树)

    题目大意 给定一棵树,边带权,问有多少点对满足二者间距离$\leq K$,$n \leq 40000$. 题解 点分治专题首杀!$Jackpot!$ (本来看着题意比较简单想捡个软柿子捏,结果手断了… ...

  4. [火星补锅] 水题大战Vol.2 T1 && luogu P1904 天际线 题解 (线段树)

    前言: 当时考场上并没有想出来...后来也是看了题解才明白 解析: 大家(除了我)都知道,奇点和偶点会成对出现,而出现的前提就是建筑的高度突然发生变化.(这个性质挺重要的,我之前没看出来) 所以就可以 ...

  5. Luogu P2158 仪仗队 题解报告

    题目传送门 [题目大意] 给定一个n×n的点方阵,求站在左下角的点能看到的点数 注意同一条直线上只能看到一个点 [思路分析] 因为是一个方阵,所以可以对称地算,那么对于半个方阵,这里假设是左上的半个方 ...

  6. $Luogu P2029$ 跳舞 题解

    一道不是十分水的\(dp\). 首先我们考虑\(dp\)方程的构造.起初我定义的状态是\(dp_{i,j}\)表示前\(i\)个格子,总共跳了\(j\)次的最大得分.但事实上它并不可以转移,因为我们不 ...

  7. Luogu P1342 请柬 题解

    差不多是Dijkstra的裸题吧... 这道题可以分为来回两个阶段. 去的时候很简单,直接用一次Dijkstra,然后统计答案. 回来的时候就有些巧妙了,虽然表面上是每个点回到起点,但是何尝不可将其看 ...

  8. 「一本通 1.1 例 4」加工生产调度(贪心算法)(luogu P1248)题解

    加工生产调度 题目描述 某工厂收到了 n n n 个产品的订单,这 n n n 个产品分别在 A.B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工. 某个产品 i i i 在 A. ...

  9. luogu P3952 时间复杂度 模拟

    题目链接 luogu P3952 时间复杂度 题解 直接模拟即可 注意不要直接return 我真是naive ...... 代码 #include<map> #include<sta ...

  10. luogu P4156 [WC2016]论战捆竹竿

    传送门 官方题解(证明都在这) 神仙题鸭qwq 转化模型,发现这题本质就是一个集合,每次可以加上集合里的数,问可以拼出多少不同的数 首先暴力需要膜意义下的最短路,例题戳这 然后这个暴力可以优化成N^2 ...

随机推荐

  1. 使用Triton部署chatglm2-6b模型

    一.技术介绍 NVIDIA Triton Inference Server是一个针对CPU和GPU进行优化的云端和推理的解决方案. 支持的模型类型包括TensorRT.TensorFlow.PyTor ...

  2. Vue源码学习(八):生命周期调用

    好家伙,   Vue源码学习(七):合并生命周期(混入Vue.Mixin) 书接上回,在上一篇中,我们已经实现了合并生命周期 现在,我们要在我们的初始化过程中,注册生命周期 1.项目目录  红框为本篇 ...

  3. CIC滤波器仿真与实验过程及结果记录

    整理于2023-10-08 0.0 前言: 前面介绍了使用matlab中的Filter Designer工具箱进行CIC抽取滤波器设计的仿真过程与结果.下面在前面的基础上针对现有的[正点原子ZYNQ] ...

  4. Go通道机制与应用详解

    本文深入探讨了Go语言中通道(Channel)的各个方面,从基础概念到高级应用.文章详细解析了通道的类型.操作方法以及垃圾回收机制,更进一步通过具体代码示例展示了通道在数据流处理.任务调度和状态监控等 ...

  5. 2020/4/26 2-sat 学习笔记

    2-sat 吧.... 其实我jio得它一点都不难 嗯 2-sat是个啥东西呢?其实就是有很多人,他们每个人有两个要求,一个要求可以说是要求一个数为0或1而对于第i个数,我们可以选择为0或为1最终询问 ...

  6. 可视化-vscode安装matplotlib工具

    可视化工具中,最流行的工具之一是 Matplotlib,它是一个数学绘图库,可以制作简单的图表,如折线图和散点图: 使用pip可以安装Matplotlib: 安装步骤:: 1.在vscode的终端输入 ...

  7. DevOps2023现状报告|注重文化、以用户为中心是成功的关键

    Google Cloud DORA 团队的一份新研究报告强调了企业文化和关注用户作为成功软件交付支柱的重要性. 2023 DevOps 状况报告分析了过去 9 年来通过此类最大规模调查收集的全球 36 ...

  8. GameFramework摘录 - 3. 使用interface定义对外接口

    GameFramework的模块密封性相当好,如果使用unity的assemblydef,其设计可以把框架项目与自己的游戏逻辑分离开来. 除一些常用的基类.枚举等,核心模块设置为internal权限, ...

  9. 长程 Transformer 模型

    Tay 等人的 Efficient Transformers taxonomy from Efficient Transformers: a Survey 论文 本文由 Teven Le Scao.P ...

  10. CSS3 rgb and rgba(透明色)的使用

    作者:WangMin 格言:努力做好自己喜欢的每一件事 对于颜色相信大家都很敏感,眼睛所见之处都存在颜色,那在css中我们用什么来表示颜色呢?CSS 中的颜色有三种定义方式:使用颜色方法(RGB.RG ...