【BZOJ5506】[GXOI/GZOI2019]旅行者(最短路)

题面

BZOJ

洛谷

题解

正着做一遍\(dij\)求出最短路径以及从谁转移过来的,反过来做一遍,如果两个点不由同一个点转移过来就更新答案。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define ll long long
#define MAX 100100
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Line{int v,next,w;}e[MAX*10];
int h[MAX],cnt=1;
inline void Add(int u,int v,int w){e[cnt]=(Line){v,h[u],w};h[u]=cnt++;}
int col[MAX];ll dis1[MAX],dis2[MAX];bool vis[MAX];
struct Node{int x,fr;ll dis;};
bool operator<(Node a,Node b){return a.dis>b.dis;}
priority_queue<Node>Q;
int n,m,K,a[MAX];ll ans;
void Dijkstra1()
{
memset(dis1,63,sizeof(dis1));memset(vis,0,sizeof(vis));
for(int i=1;i<=K;++i)dis1[a[i]]=0,col[a[i]]=a[i],Q.push((Node){a[i],a[i],0});
while(!Q.empty())
{
Node p=Q.top();Q.pop();int u=p.x;
if(vis[u])continue;vis[u]=true;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(!(i&1))continue;
if(dis1[v]>dis1[u]+e[i].w)
col[v]=col[u],dis1[v]=dis1[u]+e[i].w,Q.push((Node){v,col[u],dis1[v]});
}
}
}
void Dijkstra2()
{
memset(dis2,63,sizeof(dis2));memset(vis,0,sizeof(vis));
for(int i=1;i<=K;++i)dis2[a[i]]=0,Q.push((Node){a[i],a[i],0});
while(!Q.empty())
{
Node p=Q.top();Q.pop();int u=p.x;
if(vis[u])continue;vis[u]=true;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(i&1)continue;
if(col[v]!=col[u])ans=min(ans,dis2[u]+e[i].w+dis1[v]);
if(dis2[v]>dis2[u]+e[i].w)
dis2[v]=dis2[u]+e[i].w,Q.push((Node){v,col[u],dis2[v]});
}
}
}
int main()
{
int T=read();
while(T--)
{
n=read();m=read();K=read();
for(int i=1,u,v,w;i<=m;++i) u=read(),v=read(),w=read(),Add(u,v,w),Add(v,u,w);
for(int i=1;i<=K;++i)a[i]=read();
ans=1e18;Dijkstra1();Dijkstra2();
printf("%lld\n",ans);
for(int i=1;i<=n;++i)h[i]=col[i]=0;cnt=1;
}
return 0;
}

【BZOJ5506】[GXOI/GZOI2019]旅行者(最短路)的更多相关文章

  1. BZOJ5506 GXOI/GZOI2019旅行者(最短路)

    本以为是个二进制分组傻逼题https://www.cnblogs.com/Gloid/p/9545753.html,实际上有神仙的一个log做法https://www.cnblogs.com/asul ...

  2. P5304 [GXOI/GZOI2019]旅行者(最短路/乱搞)

    luogu bzoj Orz自己想出神仙正解的sxy 描述略 直接把所有起点推进去跑dijkstra... 并且染色,就是记录到这个点的最短路是由哪个起点引导出来的 然后再把所有边反指跑一次... 之 ...

  3. [LOJ3087][GXOI/GZOI2019]旅行者——堆优化dijkstra

    题目链接: [GXOI/GZOI2019]旅行者 我们考虑每条边的贡献,对每个点求出能到达它的最近的感兴趣的城市(设为$f[i]$,最短距离设为$a[i]$)和它能到达的离它最近的感兴趣的城市(设为$ ...

  4. P5304 [GXOI/GZOI2019]旅行者

    题目地址:P5304 [GXOI/GZOI2019]旅行者 这里是官方题解 一个图 \(n\) 点 \(m\) 条边,里面有 \(k\) 个特殊点,问这 \(k\) 个点之间两两最短路的最小值是多少? ...

  5. 洛谷 P5304 [GXOI/GZOI2019]旅行者(最短路)

    洛谷:传送门 bzoj:传送门 参考资料: [1]:https://xht37.blog.luogu.org/p5304-gxoigzoi2019-lv-xing-zhe [2]:http://www ...

  6. [GXOI/GZOI2019]旅行者 (最短路)

    题意 给定一个有向图,其中一些顶点为关键点.求这些关键点两两之间最小距离. 题解 考试时没怎么想写了50分暴力走了.以为是什么强连通分量的解法,结果就是个最短路.直接从关键点跑一次最短路dis[0], ...

  7. 洛谷 P 5 3 0 4 [GXOI/GZOI2019]旅行者

    题目描述 J 国有 n 座城市,这些城市之间通过 m 条单向道路相连,已知每条道路的长度. 一次,居住在 J 国的 Rainbow 邀请 Vani 来作客.不过,作为一名资深的旅行者,Vani 只对 ...

  8. luogu P5304 [GXOI/GZOI2019]旅行者

    传送门 所以这个\(5s\)是SMG 暴力是枚举每一个点跑最短路,然后有一个很拿衣服幼稚的想法,就是把所有给出的关键点当出发点,都丢到队列里,求最短路的时候如果当前点\(x\)某个相邻的点\(y\)是 ...

  9. [GXOI/GZOI2019]旅行者

    就我感觉这道题很神仙吗/kel 仔细想想应该也是一种适用范围挺广的做法. 考虑我们可以通过dijkstra在O(nlogn)求出一个点集到另外一个点集的最短路. 那么我们可以通过一些划分点集的方式使得 ...

随机推荐

  1. Android连续点击多次事件的实现

    有时候我们需要实现这样的场景,类似进入开发者模式,即多次点击后执行操作. 首先我们先看一个方法: System提供的一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制. publi ...

  2. URL中包含url参数,(文件路径作为参数)

    用encodeURIComponent方法,把路径放在里面,可以防止斜杠被取消. 以下attachfiles是我的一个文件的绝对路径. window.location.href="${pag ...

  3. 记阿里云SLB后配置Nginx反向代理百度地图API的坑

    需求: 百度的原始请求:https://api.map.baidu.com/place/v2/suggestion?query=s&region=sc&city_limit=true& ...

  4. js获取时间相关函数

    js获取时间函数 var myDate = new Date; var year = myDate.getFullYear();//获取当前年 var yue = myDate.getMonth()+ ...

  5. Windows之MySQL安装教程

    MySQL安装说明 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,My ...

  6. LeetCode算法题-Non-decreasing Array(Java实现)

    这是悦乐书的第283次更新,第300篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第151题(顺位题号是665).给定一个包含n个整数的数组,您的任务是通过修改最多1个元 ...

  7. Docker的使用初探(一):常用指令说明

    目录 Docker的使用初探(一):常用指令说明 为什么要用Docker Docker的安装与简单使用 国内镜像加速 常用指令 Docker的使用初探(一):常用指令说明 前几个星期实践的了,再不记录 ...

  8. Interrupt中断线程注意点

    首先我们要明确,线程中断并不会使线程立即退出,而是发送一个通知,告知目标线程你该退出了,但是后面如何处理,则完全有目标线程自行决定. 这就是和stop()不一样的地方,stop执行后线程会立即终止,这 ...

  9. 在dialog的content中嵌入select的获取选中值方法

    var shortNameList = "<select><option value='1'>1</option><option value='2' ...

  10. UVA - 11374 - Airport Express(堆优化Dijkstra)

    Problem    UVA - 11374 - Airport Express Time Limit: 1000 mSec Problem Description In a small city c ...