[JOI 2024 Final] 建设工程 2

news/2024/10/6 19:16:30/文章来源:https://www.cnblogs.com/maniubi/p/18449305

[JOI 2024 Final] 建设工程 2

题意

给出一张图和 \(S\)\(T\)。可在任意两点 \(u,v(u<v)\) 之间添加一条长度为 \(L\) 的边(只可添加一次)。

求有多少种添加方案使得 \(S\)\(T\) 的最短路长度 \(\le K\)

思路

首先,若 \(S\)\(T\) 的最短路已经 \(\le K\),答案为 \(\frac{n \times (n - 1)}{2}\)

然后求出 \(S\) 为源点的最短路和 \(T\) 为源点的最短路。

对于点 \(u,v\),若 \(dis_{S,u}+L+dis_{v,T} \le K\),则在 \(u,v\) 之间连一条边是可行的。

移项可得 \(dis_{v,T}\le K - L - dis_{S,u}\),枚举 \(dis_{S,u}\),则右侧是定值。

可将 \(dis_v\) 排序, 在 \(dis_{v}\) 中二分最后一个小于等于 \(K-L-dis_{S,u}\) 的数,统计答案即可。

这样可能会发现问题,如果我二分出来包含 \(u = v\) 的情况怎么办?

\(dis_{S,u} + L + dis_{v,T} \le K\),则 \(dis_{S,T}\) 已经 \(\le K\),会被最开始的特判判掉。

这样可能还有问题,如果我二分出来 \((u,v)\)\((v,u)\) 都统计了一遍怎么办?

若 $dis_{S,u}+L+dis_{v,T}\le K $ 且 \(dis_{S,v}+L+dis_{u,T} \le K\),则两式相加得 \(2dis_{S,T}+2L\le K\) 可推出 \(dis_{S,T}\le K\),这也会被特判掉。

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 5;
int tot, ver[N << 1], nxt[N << 1], edge[N << 1], head[N];
int n, m, s, t, l, k, dis[2][N], ans;
bool vis[N];
void add(int x, int y, int z) {ver[++ tot] = y;nxt[tot] = head[x];head[x] = tot;edge[tot] = z;
}
struct node {int id, dis;
};
bool operator < (node x, node y) {return x.dis > y.dis;
}
priority_queue <node> Q;
void dijkstra(int S, int id) {memset(vis, 0, sizeof(vis));memset(dis[id], 0x3f, sizeof(dis[id]));dis[id][S] = 0; Q.push({S, 0});while (!Q.empty()) {int x = Q.top().id; Q.pop();if (vis[x]) continue;vis[x] = 1;for (int i = head[x]; i; i = nxt[i]) {int y = ver[i], z = edge[i];if (dis[id][y] > dis[id][x] + z) {dis[id][y] = dis[id][x] + z;Q.push({y, dis[id][y]});}}}
}
signed main() {cin >> n >> m >> s >> t >> l >> k;for (int i = 1; i <= m; i ++) {int u, v, w;cin >> u >> v >> w;add(u, v, w);add(v, u, w);}dijkstra(s, 0);dijkstra(t, 1);if (dis[0][t] <= k) {cout << n * (n - 1) / 2 << '\n';return 0;}sort(dis[1] + 1, dis[1] + n + 1);for (int i = 1; i <= n; i ++) {int x = k - l - dis[0][i];int pos = upper_bound(dis[1] + 1, dis[1] + n + 1, x) - dis[1] - 1;ans += pos; }cout << ans << "\n";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/809151.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CHT

水电费是否收到fwe】今天探索一下CTH的电脑 PEPPA PIG放映室!tm的图怎么死了

visdom可视化工具

安装visdom可视化工具 pip install visdom -i 作者:太一吾鱼水 宣言:在此记录自己学习过程中的心得体会,同时积累经验,不断提高自己! 声明:博客写的比较乱,主要是自己看的。如果能对别人有帮助当然更好,不喜勿喷! 文章未经说明均属原创,学习笔记可…

测绘地理信息赋能新质生产力

在信息化与智能化浪潮的推动下,测绘地理信息作为连接现实世界与数字空间的桥梁,正逐步成为驱动经济社会发展的新质生产力。本文旨在深入探讨测绘地理信息如何通过技术创新与应用拓展,为各行各业赋能,塑造智慧社会的新面貌。一、测绘地理信息的转型之路随着卫星定位系统(如…

2024-2025-1 20241327 《计算机基础与程序设计》第2周学习总结

作业信息 |2024-2025-1-计算机基础与程序设计)| |-- |- |2024-2025-1计算机基础与程序设计第二周作业)| |快速浏览一遍教材计算机科学概论(第七版),课本每章提出至少一个自己不懂的或最想解决的问题并在期末回答这些问题 |作业正文|https://www.cnblogs.com/shr060414/p/18…

守护“金饭碗”:耕地保护,为经济社会发展筑牢根基

耕地,那片孕育着希望的田野,是我们共同的“金饭碗”。它不仅滋养着亿万生灵,更是我国经济社会发展的坚实后盾。那么,这“金饭碗”究竟蕴藏着怎样的力量,对我国经济社会发展起着怎样的作用呢?一、守护“金饭碗”,粮食安全有保障想象一下,如果我们的“金饭碗”不再丰盈,…

城市扩张与土地资源:压力之下寻平衡之道

在飞速发展的现代城市化进程中,城市扩张犹如一股不可阻挡的力量,既见证了人类文明的辉煌成就,也给土地资源带来了前所未有的压力与挑战。深入分析城市扩张对土地资源造成的影响,并探索可持续的解决方案,以期在城市发展的大潮中,找到与自然和谐共生的平衡点。 一、城市扩张…

实景三维赋能矿山安全风险监测预警

随着科技的不断进步,实景三维技术在矿山安全风险监测预警中的应用越来越广泛,它为矿山安全管理带来了革命性的变革。一、矿山安全现状矿山作为国家重要的能源和原材料基地,其安全生产直接关系到国民经济的发展和社会的稳定。然而,矿山作业环境复杂,地质条件多变,加之人为…

【笔记】SSTI学习

学习记录什么是SSTI的东西 所以什么是SSTI啊? 我不到啊!【笔记】SSTI学习 原文章:尝试黑客攻击 |SSTI (tryhackme.com) 介绍 服务器端模板注入(SSTI)是一种web漏洞攻击,它利用模板引擎的不安全特性实现。 什么是模板引擎? 模板引擎允许您创建可以在应用程序中重复使用的静…

# 2024-2025-1 学号(2024130) 《计算机基础与程序设计》第二周学习总结

作业信息 |这个作业属于哪个课程|<[2024-2025-1-计算机基础与程序设计]> (https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP))| |-- |-- | |这个作业要求在哪里|<[2024-2025-1计算机基础与程序设计第一周作业]>(https://edu.cnblogs.com/campus/besti/2024…

序列化器中拿到request

class UpdateMobileSerializer(serializers.ModelSerializer):old = serializers.CharField(write_only=True, validators=[RegexValidator(r"\d{11}", message="格式错误")])mobile = serializers.CharField(write_only=True, validators=[RegexValidator…

面相快速入门教程4五行与面相

4 五行与面相 现在,你进入了旅程中最重要的部分。在这里,你将学习到这些智慧所依据的原则,然后深入了解五种元素或原型的特质,它们在你的脸上闪耀着光芒。五种不同的元素各有两幅肖像样本,每种元素又各有两章。在第一章中,你将探索该性格的总体概况,了解它在你生活中的广…

0923人工智能教育技术学

任务一 (1)水印的功能: 1.版权保护:水印可以用来标识内容的创建者或所有者,从而防止未经授权的复制或分发。 2.身份验证:水印可以用于验证数字内容的真实性和完整性,确保内容在传输过程中没有被篡改。 3.广告和推广:水印可以作为一种低成本的广告手段,增加品牌曝光度。…