[GXOI/GZOI2019]旅行者
就我感觉这道题很神仙吗/kel
仔细想想应该也是一种适用范围挺广的做法。
考虑我们可以通过dijkstra在O(nlogn)求出一个点集到另外一个点集的最短路。
那么我们可以通过一些划分点集的方式使得每一对点都被计算一次。
考虑按照二进制划分。
两个不同的数至少有一个二进制位不同。
按照每一个二进制位01分组,跑logn次dijkstra即可得出答案。
#include<bits/stdc++.h>
#define N 220000
#define M 1100000
#define eps 1e-7
#define inf 1e18+7
#define db double
#define ll long long
#define ldb long double
using namespace std;
inline ll read()
{
char ch=0;
ll x=0,flag=1;
while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*flag;
}
struct edge{ll to,nxt,w;}e[M];
ll num,head[N];
inline void add(ll x,ll y,ll z){e[++num]={y,head[x],z};head[x]=num;}
struct node{ll i,di;};
bool operator<(node a,node b){return a.di>b.di;}
priority_queue<node>q;
ll n,m,k,s,tmp,ans,p[N],dis[N];
void dijkstra()
{
q.push((node){s,0});dis[s]=0;
for(ll i=1;i<=n;i++)dis[i]=inf;
while(!q.empty())
{
node k=q.top();q.pop();
ll x=k.i;if(k.di!=dis[x])continue;
for(ll i=head[x];i!=-1;i=e[i].nxt)
{
ll to=e[i].to;
if(dis[to]>dis[x]+e[i].w)dis[to]=dis[x]+e[i].w,q.push({to,dis[to]});
}
}
}
void work()
{
n=read();m=read();k=read();ans=inf;
num=-1;for(int i=0;i<=2*n;i++)head[i]=-1;
for(ll i=1;i<=m;i++){ll x=read(),y=read(),z=read();add(x,y,z);}
s=n+1;tmp=num;for(ll i=1;i<=k;i++)p[i]=read();
for(ll i=0;i<=17;i++)
{
for(ll x=1;x<=k;x++)if((1<<i)&p[x])add(s,p[x],0);dijkstra();
for(ll x=1;x<=k;x++)if(!((1<<i)&p[x]))ans=min(ans,dis[p[x]]);
head[s]=-1;num=tmp;
for(ll x=1;x<=k;x++)if(!((1<<i)&p[x]))add(s,p[x],0);dijkstra();
for(ll x=1;x<=k;x++)if((1<<i)&p[x])ans=min(ans,dis[p[x]]);
head[s]=-1;num=tmp;
}
printf("%lld\n",ans);
}
int main()
{
int t=read();
for(int i=1;i<=t;i++)work();
return 0;
}
[GXOI/GZOI2019]旅行者的更多相关文章
- [LOJ3087][GXOI/GZOI2019]旅行者——堆优化dijkstra
题目链接: [GXOI/GZOI2019]旅行者 我们考虑每条边的贡献,对每个点求出能到达它的最近的感兴趣的城市(设为$f[i]$,最短距离设为$a[i]$)和它能到达的离它最近的感兴趣的城市(设为$ ...
- P5304 [GXOI/GZOI2019]旅行者
题目地址:P5304 [GXOI/GZOI2019]旅行者 这里是官方题解 一个图 \(n\) 点 \(m\) 条边,里面有 \(k\) 个特殊点,问这 \(k\) 个点之间两两最短路的最小值是多少? ...
- 【BZOJ5506】[GXOI/GZOI2019]旅行者(最短路)
[BZOJ5506][GXOI/GZOI2019]旅行者(最短路) 题面 BZOJ 洛谷 题解 正着做一遍\(dij\)求出最短路径以及从谁转移过来的,反过来做一遍,如果两个点不由同一个点转移过来就更 ...
- 洛谷 P 5 3 0 4 [GXOI/GZOI2019]旅行者
题目描述 J 国有 n 座城市,这些城市之间通过 m 条单向道路相连,已知每条道路的长度. 一次,居住在 J 国的 Rainbow 邀请 Vani 来作客.不过,作为一名资深的旅行者,Vani 只对 ...
- 洛谷 P5304 [GXOI/GZOI2019]旅行者(最短路)
洛谷:传送门 bzoj:传送门 参考资料: [1]:https://xht37.blog.luogu.org/p5304-gxoigzoi2019-lv-xing-zhe [2]:http://www ...
- luogu P5304 [GXOI/GZOI2019]旅行者
传送门 所以这个\(5s\)是SMG 暴力是枚举每一个点跑最短路,然后有一个很拿衣服幼稚的想法,就是把所有给出的关键点当出发点,都丢到队列里,求最短路的时候如果当前点\(x\)某个相邻的点\(y\)是 ...
- BZOJ5506 GXOI/GZOI2019旅行者(最短路)
本以为是个二进制分组傻逼题https://www.cnblogs.com/Gloid/p/9545753.html,实际上有神仙的一个log做法https://www.cnblogs.com/asul ...
- P5304 [GXOI/GZOI2019]旅行者(最短路/乱搞)
luogu bzoj Orz自己想出神仙正解的sxy 描述略 直接把所有起点推进去跑dijkstra... 并且染色,就是记录到这个点的最短路是由哪个起点引导出来的 然后再把所有边反指跑一次... 之 ...
- [GXOI/GZOI2019]旅行者 (最短路)
题意 给定一个有向图,其中一些顶点为关键点.求这些关键点两两之间最小距离. 题解 考试时没怎么想写了50分暴力走了.以为是什么强连通分量的解法,结果就是个最短路.直接从关键点跑一次最短路dis[0], ...
随机推荐
- python解析FreeMind思维导图
记录瞬间 在实际工作中,通常需要使用思维导图进行一些分析和设计,但是,在设计好之后,想要把思维导图的内容转化成文字进行输出怎么做呢? 使用python(当然可以使用其他的语言进行处理)可以很好的解决这 ...
- 【ASP.NET Core】在CentOS上安装.NET Core运行时、部署到CentOS
第一步:Add the dotnet product feed sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc ...
- Catch That Cow (BFS广搜)
问题描述: Farmer John has been informed of the location of a fugitive cow and wants to catch her immedia ...
- hdu 2838 Cow Sorting
题意: 给出一个数组,要求把他们排成升序,两个数字交换的代价是x + y,求代价的总和. 思路: 简单的逆序对变形,树状数组维护小于的cnt和sum即可. 代码: #include <stdio ...
- Unity用Vuforia做AR实现脱卡效果
这篇不错,记录下,博主不让转载 http://blog.csdn.net/qwe161819/article/details/76107105
- selenium 定位密码软键盘
from selenium import webdriver import time driver = webdriver.Chrome() driver.maximize_window() driv ...
- 第十五节 JS面向对象实例及高级
实例:面向对象的选项卡 把面向过程的程序,改写成面向对象的形式 原则:不能有函数套函数,但可以有全局变量 过程: onload —— 改写成 构造函数,其中window.onload的功能是在页面加载 ...
- 安卓GreenDao(基础)
GreenDao的基础使用很简单,网上一大筐,推荐在简书里面搜索,那么我这里要说些什么呢,试想,这些简单的Demo可以带你了解GreenDao,但你能用这些代码做公司的项目么,肯定不行,所以我结合自身 ...
- 牛客OI周赛7-提高组 A 小睿睿的等式
链接:https://ac.nowcoder.com/acm/contest/371/A来源:牛客网 小睿睿在游戏开始时有n根火柴棒,他想知道能摆成形如“A+B=n”的等式且使用的火柴棒数也恰好等于n ...
- jdbc之工具类DBUtil的使用
首先回顾一下jdbc的使用方法: 1. 注册驱动 2. 建立连接 3. 建立statement 4. 定义sql语句 5. 执行sql语句,如果执行的是查询需遍历结果集 6. 关闭连接 其中建立连接和 ...