[GX/GZOI2019]旅行者(dijkstra)】的更多相关文章

二进制分组SB做法没意思还难写还可能会被卡常其实是我不会写.用一种比较优秀的O(Tnlogn)做法,只需要做2次dijkstra.对原图做一次.对反图做一次,然后记录每个点的最短路是从k个源点中的哪个转移过来的.然后枚举每条边,若两边转移过来的源点不同,则用d1+w[i]+d2来更新答案即可. #include<bits/stdc++.h> using namespace std; typedef long long ll; ,M=5e5+; struct node{int u;ll d;};…
题目链接: [GXOI/GZOI2019]旅行者 我们考虑每条边的贡献,对每个点求出能到达它的最近的感兴趣的城市(设为$f[i]$,最短距离设为$a[i]$)和它能到达的离它最近的感兴趣的城市(设为$g[i]$,最短距离设为$b[i]$). 那么每条边$(u,v,w)$的贡献就是$a[u]+w+b[v]$,用这个值去更新答案即可(这个值代表$f[u]$到$g[v]$的最短路长度). 但要注意一条边能更新答案需要满足$f[u]\neq g[v]$,因为要保证起点和终点不同. 手画一下就可以知道最短…
GX/GZOI2019 day2 解题报告 题目链接 逼死强迫症 旅行者 旧词 t1 逼死强迫症 显然地,记 \(f(i)\) 为长度为 \(i\) 的木板的答案,可得: \(\\\) \[f(i)=\begin{cases} 0 \quad ······························ \quad (i \in [0,2]) \\ f(i-1)+f(i-2)+2 \times pre(i-3) \quad ·· \quad ( i \in [3,+\infty])) \end{…
题目地址:P5304 [GXOI/GZOI2019]旅行者 这里是官方题解 一个图 \(n\) 点 \(m\) 条边,里面有 \(k\) 个特殊点,问这 \(k\) 个点之间两两最短路的最小值是多少? \(n \leq 10^5, m \leq 5 * 10 ^5\) 假设我们把特殊点分成 \(A,B\) 两个集合,新建 \(s\) 连 \(A\) 集合的所有点,边权 \(0\) ,新建 \(t\) 连接 \(B\) 集合里的所有点,边权 \(0\) ,那么 \(s\) 到 \(t\) 的最短路…
[BZOJ5506][GXOI/GZOI2019]旅行者(最短路) 题面 BZOJ 洛谷 题解 正着做一遍\(dij\)求出最短路径以及从谁转移过来的,反过来做一遍,如果两个点不由同一个点转移过来就更新答案. #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; #define ll long long #define MAX 10…
题目描述 J 国有 n 座城市,这些城市之间通过 m 条单向道路相连,已知每条道路的长度. 一次,居住在 J 国的 Rainbow 邀请 Vani 来作客.不过,作为一名资深的旅行者,Vani 只对 J 国的 kk 座历史悠久.自然风景独特的城市感兴趣.为了提升旅行的体验,Vani 想要知道他感兴趣的城市之间「两两最短路」的最小值(即在他感兴趣的城市中,最近的一对的最短距离). 也许下面的剧情你已经猜到了——Vani 这几天还要忙着去其他地方游山玩水,就请你帮他解决这个问题吧. 输入格式 每个测…
本以为是个二进制分组傻逼题https://www.cnblogs.com/Gloid/p/9545753.html,实际上有神仙的一个log做法https://www.cnblogs.com/asuldb/p/10721251.html.下面代码是二进制分组的. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #incl…
就我感觉这道题很神仙吗/kel 仔细想想应该也是一种适用范围挺广的做法. 考虑我们可以通过dijkstra在O(nlogn)求出一个点集到另外一个点集的最短路. 那么我们可以通过一些划分点集的方式使得每一对点都被计算一次. 考虑按照二进制划分. 两个不同的数至少有一个二进制位不同. 按照每一个二进制位01分组,跑logn次dijkstra即可得出答案. #include<bits/stdc++.h> #define N 220000 #define M 1100000 #define eps…
传送门 正反两边dijkstra染色,然后枚举一下边,求出最小值就好啦 代码: #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<queue> using namespace std; void read(int &x) { char ch; bool ok; for(ok=0,ch=getchar(); !isdigit(…
luogu bzoj Orz自己想出神仙正解的sxy 描述略 直接把所有起点推进去跑dijkstra... 并且染色,就是记录到这个点的最短路是由哪个起点引导出来的 然后再把所有边反指跑一次... 之后枚举每一条边两边的点不同色就可以更新答案 这个可能少有的代码比说得清楚... #include<cstdio> #include<queue> #include<algorithm> using std::min; using std::priority_queue; t…