【LOJ3087】「GXOI / GZOI2019」旅行者
题意
给定一个 \(n\) 个点 \(m\) 条边的的有向图,给出 \(k\) 个关键点,求关键点两两最短路的最小值。
\(n\le 10^5, m\le 5\cdot 10^5\).
题解
二进制分组。对于每一位,将编号当前位为 \(0\) 的点做源点/汇点, 当前位为 \(1\) 的点做汇点/源点,然后跑最短路。
复杂度 \(O(n\log ^2 n)\) .
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
namespace io {
const int SIZE=(1<<21)+1;
char ibuf[SIZE],*iS,*iT,c; int qr;
#define gc()(iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),(iS==iT?EOF:*iS++)):*iS++)
inline int gi (){
int x=0;
for(c=gc();c<'0'||c>'9';c=gc());
for(;c<='9'&&c>='0';c=gc()) x=(x<<1)+(x<<3)+(c&15); return x;
}
} using io::gi;
const int N=1e5+5,M=5e5+5;
typedef long long ll;
int head[N],nxt[M],to[M],wei[M],n,m,k,key[N];
#define pr pair<int,int>
priority_queue< pr,vector<pr>,greater<pr> > q;
ll dis[N];
void addedge(int u, int v, int w, int now) {
nxt[now]=head[u], head[u]=now, to[now]=v, wei[now]=w;
}
int main()
{
#ifdef lc
freopen("a.in","r",stdin);
#endif
int T=gi();
while(T--)
{
memset(head,0,sizeof(head));
n=gi(),m=gi(),k=gi();
for(int i=1;i<=m;++i)
{
int u=gi(),v=gi(),w=gi();
addedge(u,v,w,i);
}
for(int i=1;i<=k;++i) key[i]=gi();
ll ans=1ll<<60;
for(int i=0;i<17;++i)
{
memset(dis,0x3f,sizeof(dis));
for(int j=1;j<=k;++j)
if(key[j]&(1<<i))
{
dis[key[j]]=0;
q.push(make_pair(0,key[j]));
}
while(!q.empty())
{
ll tmp=q.top().first;
int u=q.top().second; q.pop();
if(dis[u]!=tmp)continue;
for(int e=head[u];e;e=nxt[e])
if(dis[to[e]]>dis[u]+wei[e])
{
dis[to[e]]=dis[u]+wei[e];
q.push(make_pair(dis[to[e]],to[e]));
}
}
for(int j=1;j<=k;++j) if(!(key[j]&(1<<i))) ans=min(ans,dis[key[j]]);
}
for(int i=0;i<17;++i)
{
memset(dis,0x3f,sizeof(dis));
for(int j=1;j<=k;++j)
if(!(key[j]&(1<<i)))
{
dis[key[j]]=0;
q.push(make_pair(0,key[j]));
}
while(!q.empty())
{
ll tmp=q.top().first;
int u=q.top().second; q.pop();
if(dis[u]!=tmp)continue;
for(int e=head[u];e;e=nxt[e])
if(dis[to[e]]>dis[u]+wei[e])
{
dis[to[e]]=dis[u]+wei[e];
q.push(make_pair(dis[to[e]],to[e]));
}
}
for(int j=1;j<=k;++j) if(key[j]&(1<<i)) ans=min(ans,dis[key[j]]);
}
printf("%lld\n",ans);
}
}
【LOJ3087】「GXOI / GZOI2019」旅行者的更多相关文章
- 【LOJ】#3087. 「GXOI / GZOI2019」旅行者
LOJ#3087. 「GXOI / GZOI2019」旅行者 正着求一遍dij,反着求一遍,然后枚举每条边,从u到v,如果到u最近的点和v能到的最近的点不同,那么可以更新答案 没了 #include ...
- LOJ#3087. 「GXOI / GZOI2019」旅行者(最短路)
题面 传送门 题解 以所有的感兴趣的城市为起点,我们正着和反着各跑一边多源最短路.记\(c_{0/1,i}\)分别表示正图/反图中离\(i\)最近的起点,那么对于每条边\((u,v,w)\),如果\( ...
- 「GXOI / GZOI2019」旅行者
题目 我还是太傻了 考虑每一条边的贡献,对于一条有向边\((u,v,w)\),我们求出\(k\)个关键点中到\(u\)最近的距离\(dis_1\),以及\(v\)到\(k\)个关键点中最近的距离\(d ...
- 「GXOI / GZOI2019」简要题解
「GXOI / GZOI2019」简要题解 LOJ#3083. 「GXOI / GZOI2019」与或和 https://loj.ac/problem/3083 题意:求一个矩阵的所有子矩阵的与和 和 ...
- LOJ#3083.「GXOI / GZOI2019」与或和_单调栈_拆位
#3083. 「GXOI / GZOI2019」与或和 题目大意 给定一个\(N\times N\)的矩阵,求所有子矩阵的\(AND(\&)\)之和.\(OR(|)\)之和. 数据范围 \(1 ...
- Loj #3085. 「GXOI / GZOI2019」特技飞行
Loj #3085. 「GXOI / GZOI2019」特技飞行 题目描述 公元 \(9012\) 年,Z 市的航空基地计划举行一场特技飞行表演.表演的场地可以看作一个二维平面直角坐标系,其中横坐标代 ...
- 【LOJ】#3088. 「GXOI / GZOI2019」旧词
LOJ#3088. 「GXOI / GZOI2019」旧词 不懂啊5e4感觉有点小 就是离线询问,在每个x上挂上y的询问 然后树剖,每个节点维护轻儿子中已经被加入的点的个数个数乘上\(dep[u]^{ ...
- 【LOJ】#3086. 「GXOI / GZOI2019」逼死强迫症
LOJ#3086. 「GXOI / GZOI2019」逼死强迫症 这个就是设状态为\(S,j\)表示轮廓线为\(S\),然后用的1×1个数为j 列出矩阵转移 这样会算重两个边相邻的,只要算出斐波那契数 ...
- 【LOJ】#3085. 「GXOI / GZOI2019」特技飞行
LOJ#3085. 「GXOI / GZOI2019」特技飞行 这显然是两道题,求\(C\)是一个曼哈顿转切比雪夫后的线段树扫描线 求\(AB\),对向交换最大化和擦身而过最大化一定分别为最大值和最小 ...
随机推荐
- Educational Codeforces Round 76 (Rated for Div. 2) A. Two Rival Students
You are the gym teacher in the school. There are nn students in the row. And there are two rivalling ...
- Springboot项目搭建(3)-shiro登录
shiro简述+实现简单登录:https://www.jianshu.com/p/7f724bec3dc3
- Atcoder Beginner Contest151D(迷宫问题求任意两点最短路径的最大值,BFS)
BFS可以求得最短路,DFS会找到从当前点到图中叶子结点的路径. #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using na ...
- Java经典面试笔试题及答案
1.什么是对象序列化,为什么要使用? 所谓对象序列化就是把一个对象以二进制流的方式保存到硬盘上.好处:方便远程调用. 2.值传递与引用传递的区别? 所谓值传递就是把一个对象的值传给一个新的变量,但是系 ...
- 题解 P1283 【平板涂色】
P1283 平板涂色 数据范围也太小了qwq..适合本萌新暴搜 小小的剪枝: 1.用pre预处理出每块矩形上方的矩形,pre[i][0]记录数目(如果数据范围再开大一点,直接1~n枚举判断可能超时qw ...
- 2020 i春秋新春战疫公益赛 misc
0x01 code_in_morse morse decode后得到: RFIE4RYNBINAUAAAAAGUSSCEKIAAAAEUAAAAA7AIAYAAAAEPFOMTWAAABANUSRCB ...
- qq音乐解析API
文档:www.tjit.net 开放的接口:api88.net 个人代码: input2(event){ //将字符转化为encodeURL编码,才能进行正确请求,这是这个接口要求的 //js自带的转 ...
- NOIP--模拟—————神奇的幻方
神奇的幻方 题目描述 幻方是一种很神奇的 N*N 矩阵:它由数字 1,2,3,-N x N 构成,且每行.每列及两条对角线上的数字之和都相同. 当 N 为奇数时,我们可以通过下方法构建一个幻方: 首先 ...
- Java面向对象编程 -6.2
数组的引用传递 通过数组的基本定义可以发现,在数组使用的过程中依然需要使用new进行内存空间的开辟,同理,那么也一定存在有内存的关系匹配问题. 但是数组本身毕竟属于引用数据类型,那么既然是引用数据类型 ...
- 【PAT甲级】1082 Read Number in Chinese (25 分)
题意: 输入一个九位整数,输出它的汉字读法(用拼音表示). trick: 字符串数组""其实会输出一个空格,而不是什么都不输出,导致测试点0和4格式错误. AAAAAccepted ...