P5304 [GXOI/GZOI2019] 旅行者 题解

news/2025/12/9 22:12:35/文章来源:https://www.cnblogs.com/Creativexxx/p/19328548

P5304 [GXOI/GZOI2019] 旅行者

Description

给你一个 \(n\) 个点,\(m\) 条边的有向连通图,给出 \(k\) 个点的编号,让你求出这些点中距离最近的两点之间距离。

\(n\le 10^5,m\le 5\times 10^5\)

Solution

这题是一个十分经典的 trick —— 二进制分组

大概的思路类似于有源汇网络流,即建立一个超级源点和超级汇点,跑最短路。具体来说,把 \(k\) 个结点随机分到两个集合 \(s\)\(t\) 中,用一个 bool 数组来记录这 \(k\) 个点,如果编号为 \(i\) 的点在 \(s\) 中记为 \(0\),在 \(t\) 中记为 \(1\)

由于这个图是有向图,所以先从超级源点向所有 \(s\) 中的点连边,从 \(t\) 中的所有点向 \(t\) 连边跑 \(\log n\) 次最短路,再反过来跑 \(\log n\) 次最短路,最后所有最短路的最小值即为答案。

时间复杂度 \(O(Tn\log n\log k)\),可以通过。

#include<bits/stdc++.h>
#define int long long
using namespace std;
long long T,n,m,k,a[500005],ans;
priority_queue<pair<int,int>>q;
struct graph{long long tot,head[500005],id[500005],dis[500005];struct node{int from,to,w,nxt;}e[500005];inline void init(){tot=0;memset(head,0,sizeof(head));return;}inline void add(int u,int v,int w){e[++tot].from=u;e[tot].to=v;e[tot].w=w;e[tot].nxt=head[u];head[u]=tot;return;}inline void dijkstra(){for(int i=1;i<=500000;i++){dis[i]=LONG_LONG_MAX;id[i]=0;}for(int i=1;i<=k;i++){dis[a[i]]=0;id[a[i]]=a[i];q.push(make_pair(0,a[i]));}while(!q.empty()){int u=q.top().second;int d=-q.top().first;q.pop();if(d==dis[u]){for(int i=head[u];i;i=e[i].nxt){int v=e[i].to,w=e[i].w;if(dis[v]>d+w){dis[v]=d+w;id[v]=id[u];q.push(make_pair(-dis[v],v));}}}}return;}
}G[2];
signed main(){cin>>T;while(T--){cin>>n>>m>>k;G[0].init();G[1].init();for(int i=1;i<=m;i++){int u,v,w;cin>>u>>v>>w;if(u^v){G[0].add(u,v,w);G[1].add(v,u,w);}}for(int i=1;i<=k;i++){cin>>a[i];}G[0].dijkstra();G[1].dijkstra();ans=LONG_LONG_MAX;for(int u=1;u<=n;u++){for(int i=G[0].head[u];i;i=G[0].e[i].nxt){int v=G[0].e[i].to;int w=G[0].e[i].w;if(G[0].id[u]&&G[1].id[v]&&G[0].id[u]^G[1].id[v]){ans=min(ans,G[0].dis[u]+G[1].dis[v]+w);}}}cout<<ans<<endl;}return 0;
}

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

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

相关文章

2025 年面膜消费指南:告别盲目囤货,10款补水保湿抗老修护爆款适配干油敏肌,精准解决护肤痛点 - 资讯焦点

一抹精华浸润肌底,熬夜的蜡黄倦容悄然褪去;一贴膜布贴合脸颊,换季的泛红干痒即刻舒缓;分区护理精准发力,T 区的油光与 U 区的干纹同时消失 —— 这是 2025 年新一代功效型面膜带来的护肤新体验。 据华泰研究所 20…

P3275 [SCOI2011] 糖果 题解

P3275 [SCOI2011] 糖果 题解P3275 [SCOI2011] 糖果 Description 给你 \(k\) 个指令(约束条件),让你构造一个长度为 \(n\) 的正整数序列 A,满足这个条件的同时让所有元素的和最小。 指令的格式如下:1 a b 表示 \(A…

the attitude

some Chinese talked with people comes from R. they will discuss that one with their friends, is the people just monkey to be discussed? I will never do that.

2025年国内正规的微动开关工厂怎么选购,家电微动开关/大电流微动开关/新能源微动开关/小型微动开关/汽车微动开关供货商怎么选 - 品牌推荐师

随着工业自动化、智能家电及新能源汽车等领域的蓬勃发展,作为关键控制元件的微动开关,其市场需求持续攀升。面对市场上众多的微动开关制造商,采购方如何甄别与选择一家技术可靠、品质稳定、供货能力强的正规工厂,成…

win10 vscode 使用ssh登录 ubuntu

win10 vscode 使用ssh登录 ubuntuvscode ssh在Ubuntu上建立SSH服务器,然后从Windows 10上的VSCode连接。 git操作 cd到项目目录 如果要在局域网中搭建git仓库,先要将下载的项目中有git工程配置文件删除掉 rm -rf .gi…

P4064 [JXOI2017] 加法 题解

P4064 [JXOI2017] 加法 题解P4064 [JXOI2017] 加法 Description 给你一个长度为 \(n\) 的正整数序列 \(A\),再给你 \(m\) 个区间,让你在这 \(m\) 个区间中选出 \(k\) 个进行区间加 \(a\) 操作(\(a\) 为常数),使得…

2025年河南工业大学2025新生周赛 (7)

A 回声 将连续的字母和连字符视为同一个单词bool isWordChar(char c) {if ((c >= a && c <= z) ||(c >= A && c <= Z) ||c == -) {return true;}return false; }从头到尾遍历,并存单词即…

P3076 [USACO13FEB] Taxi G 题解

P3076 [USACO13FEB] Taxi GP3076 [USACO13FEB] Taxi G Description 有一条长度为 \(m\) 的数轴,有 \(n\) 头牛需要坐车前往别的地方,起点和终点分别为 \(a_i\) 和 \(b_i\)。 现在一辆出租车从原点出发,要运送完所有…

第四章 串

串的定义和实现 串的基本概念 串的定义 串,即字符串,是由零个或多个字符组成的有限序列,一般记为 \[S=a_{1}a_{2}a_{3}...a_{n}(n\ge0) \]其中,S是串名,单引号括起来的字符序列是串的值,\(a_{i}\)可以是字母、数…

数据采集第四次作业-102302128吴建良

作业1:基于 Selenium 和 MySQL 的股票数据爬取 码云仓库:https://gitee.com/wujianliang9/2025-data-collection/tree/master/第四次作业/作业1 一、核心代码与方法 (Code & Methodology) 核心代码 以下是实现爬…

102302142罗伟钊第四次作业

作业1: - 要求: ▪ 熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内 容。 ▪ 使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、 “深证A股”3个板块的股票数据信息。 ▪…

北京SAT辅导机构选课指南:高分攻略与机构测评(2025最新) - 品牌测评鉴赏家

北京SAT辅导机构选课指南:高分攻略与机构测评(2025最新)一、选机构先看 “硬指标”:三大核心维度帮你筛出优质选项 (一)师资实力:实考经验 + 教研能力是提分 “双保险” 真正懂 SAT 的老师,不仅要会教,更要 “…

第四次作业-何玮鑫

作业4 一、沪深 A 股数据爬取:Ajax 动态数据抓取与结构化存储 1.1 实现方案与核心代码 需求背景与整体思路 本次任务核心目标是爬取东方财富网沪深 A 股、上证 A 股、深证 A 股三大板块的股票数据,解决Ajax 动态加载…

[ABC212D] Querying Multiset 题解

[ABC212D] Querying Multiset 题解[ABC212D] Querying Multiset Description 给你一个集合,让你支持三种操作:将 \(x\) 加入集合。把集合中的数都加上 \(x\)。将集合中最小的数删除,并且输出这个数。Solution 考虑使…

P4105 [HEOI2014] 南园满地堆轻絮 题解

P4105 [HEOI2014] 南园满地堆轻絮 题解P4105 [HEOI2014] 南园满地堆轻絮 Description 给你一个长度为 \(n\) 的正整数序列 \(a\),让你构造一个单调不降的正整数序列 \(b\),使得下面式子的值尽量小。 \[\max_{i=1}^{n…

【树莓派】【v4l2】在树莓派环境下取流-编码-存储

硬件环境:树莓派3B+ Camera模块:rpi Camera(500像素) 编码库:x264 工程代码 #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <fcntl.h>…

Daily Report — Day 4 (Beta)

Daily Report — Day 4 (Beta) 📅 日期:2025/12/05 👥 参与人:zc、lzy、shr ✅ 昨日完成工作(Day 3 落地成果)单元测试体系落地(CI 集成完成)完成 Jest + TS 环境配置,成功挂载至 GitHub Actions 流水线; …

[ABC241D] Sequence Query 题解

[ABC241D] Sequence Query 题解[ABC241D] Sequence Query Description 有一个空序列 \(a\)。给定 \(q\) 次操作,每次询问是以下三种之一:1 x:向 \(a\) 中插入元素 \(x\)。 2 x k:输出 \(a\) 中所有 \(\le x\) 的元…

Prometheus + Grafana 原理和用法

Prometheus + Grafana 原理和用法(通俗易懂版) 我们可以把这个组合想象成 「智能体检中心」:Prometheus = 体检医生:主动上门,定期采集服务器/应用的“健康数据”(CPU、内存、接口响应时间等),并把数据存起来。…

2025年度不锈钢板直销优质厂家TOP榜单盘点,不锈钢中厚板/201不锈钢板/不锈钢热轧板/不锈钢板现货批发哪家好 - 品牌推荐师

随着制造业的转型升级与基建投资的稳步推进,不锈钢板作为重要的工业与建筑原材料,其市场需求持续增长,对供应商的产品品质、供应能力及综合服务提出了更高要求。面对市场上众多的不锈钢板直销厂家,如何选择一家可靠…