【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\),对向交换最大化和擦身而过最大化一定分别为最大值和最小 ...
随机推荐
- CSS学习(10)行盒盒模型
常见的行盒:包含具体内容的元素 span.strong.em.i.img.video.audio 显著特点: 1.盒子沿着内容延伸 2.行盒不能设置宽高,调整行盒的宽高,应使用字体大小.行高.字体类型 ...
- Layui自定义模块的使用方式
为什么要自定义模块呢?好处很多.比如可以大量重用代码...... 根据layui官方的文档说明.首先第一步是要确定你要扩展的模块名称 现在做的是登录功能.因此扩展模块名叫 login 使用layui ...
- KFC 小猪短租
# 分析肯德基门店信息 import requests,json post_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op= ...
- VS2017新建或拷贝项目编译时出现:找不到 Windows SDK 版本8.1.请安装所需的版本的 Windows SDK
VS2017新建或拷贝项目编译时出现:找不到 Windows SDK 版本8.1.请安装所需的版本的 Windows SDK 或者在项目属性页的问题解决方案 解决方法: 右击项目解决方案, 选择:重定 ...
- python-线程池的两种实现方式 【转载】
#!/usr/bin/env python # -*- coding:utf-8 -*- import queue import threading import contextlib import ...
- css与js基础
CSS样式 1 宽高设置 块元素可使用 wid 1字体 font-family : 文本类型 font-size 字体大小 font-style 字体样式 斜体italic 正常norm ...
- Ethereum Learning Materials
Home 注:本页为 EthFans 站内文章精选集.鉴于文章的采集范围较广,我们无法保证文章内容没有重复,也不能保证排列的顺序实现了最优的认识路径.我们只能说,这些文章是我们精挑细选后,确认可以长期 ...
- Vue基础笔记2
目录 1. 如何获取Vue对象中的成员? 2. pre指定 3. for循环 4. todolist 5. 分隔符 6. computed 计算后的 7. vue的生命周期(讲解不全) 8. watc ...
- TensorFlow使用RNN实现手写数字识别
学习,笔记,有时间会加注释以及函数之间的逻辑关系. # https://www.cnblogs.com/felixwang2/p/9190664.html # https://www.cnblogs. ...
- PTA点赞狂魔
点赞狂魔 (25 分) 微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持.每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性.然而有这么一种人,他们会通过给自己看 ...