【BZOJ5506】[GXOI/GZOI2019]旅行者(最短路)
题面
题解
正着做一遍\(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]旅行者(最短路)的更多相关文章
-
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... 并且染色,就是记录到这个点的最短路是由哪个起点引导出来的 然后再把所有边反指跑一次... 之 ...
-
[LOJ3087][GXOI/GZOI2019]旅行者——堆优化dijkstra
题目链接: [GXOI/GZOI2019]旅行者 我们考虑每条边的贡献,对每个点求出能到达它的最近的感兴趣的城市(设为$f[i]$,最短距离设为$a[i]$)和它能到达的离它最近的感兴趣的城市(设为$ ...
-
P5304 [GXOI/GZOI2019]旅行者
题目地址:P5304 [GXOI/GZOI2019]旅行者 这里是官方题解 一个图 \(n\) 点 \(m\) 条边,里面有 \(k\) 个特殊点,问这 \(k\) 个点之间两两最短路的最小值是多少? ...
-
洛谷 P5304 [GXOI/GZOI2019]旅行者(最短路)
洛谷:传送门 bzoj:传送门 参考资料: [1]:https://xht37.blog.luogu.org/p5304-gxoigzoi2019-lv-xing-zhe [2]:http://www ...
-
[GXOI/GZOI2019]旅行者 (最短路)
题意 给定一个有向图,其中一些顶点为关键点.求这些关键点两两之间最小距离. 题解 考试时没怎么想写了50分暴力走了.以为是什么强连通分量的解法,结果就是个最短路.直接从关键点跑一次最短路dis[0], ...
-
洛谷 P 5 3 0 4 [GXOI/GZOI2019]旅行者
题目描述 J 国有 n 座城市,这些城市之间通过 m 条单向道路相连,已知每条道路的长度. 一次,居住在 J 国的 Rainbow 邀请 Vani 来作客.不过,作为一名资深的旅行者,Vani 只对 ...
-
luogu P5304 [GXOI/GZOI2019]旅行者
传送门 所以这个\(5s\)是SMG 暴力是枚举每一个点跑最短路,然后有一个很拿衣服幼稚的想法,就是把所有给出的关键点当出发点,都丢到队列里,求最短路的时候如果当前点\(x\)某个相邻的点\(y\)是 ...
-
[GXOI/GZOI2019]旅行者
就我感觉这道题很神仙吗/kel 仔细想想应该也是一种适用范围挺广的做法. 考虑我们可以通过dijkstra在O(nlogn)求出一个点集到另外一个点集的最短路. 那么我们可以通过一些划分点集的方式使得 ...
随机推荐
-
hdu 1142(DFS+dijkstra)
#include<iostream> #include<cstdio> #include<cmath> #include<map> #include&l ...
-
EF-CodeFirst-1 玩起来
注本文是学习旺杰兄的CodeFirst系列所写 CodeFirst CodeFirst是一种全新的玩法,代码先行使得我们更了解实体之间的关系.而且更加符合了DDD领域驱动设计的思想 .所以CodeFi ...
-
h5交互元素details标签
details是h5新增的交互元素,details与 summary 标签配合使用可以为 details 定义标题.默认情况下,不显示 details 标记中的内容.当用户点击标题时,会显示出 det ...
-
ali2015校园招聘笔试大题
[本文链接] http://www.cnblogs.com/hellogiser/p/ali-2015-questions.html 1. 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函 ...
-
关于dom ready事件
0.加载完页面,解析完所有标签(不包括执行CSS和JS),并如规范中所说的设置 interactive 和执行每个静态的script标签中的JS,然后触发. 1.没有js,有css,有img,DOMC ...
-
Sprint第二个冲刺(第三天)
一.Sprint 计划会议: 今天我们召开了第二个Sprint的第三次会议,会议上我们把各自完成的情况进行了一次总结,现在主界面和美化按钮.增添图片的功能已经完成了,Doing里面的其他 ...
-
sublime3的licence(update 2016-04-14)
—– BEGIN LICENSE —–Michael BarnesSingle User LicenseEA7E-8213858A353C41 872A0D5C DF9B2950 AFF6F667C4 ...
-
【转】PS学堂之一:展示一下自己做的圆形印章
共分七个步骤: 1.点击文件--新建,新建一个500×500像素,背景为透明的文件,选择RGB颜色. 2.把前景色和文字颜色设置为正红(R为255,G和B为0). 3.在视图下拉菜单中选择标尺,将横. ...
-
oracle添加数据时主键自动增长
CREATE TABLE STUDENT( --创建学生表 ID NUMBER(10) PRIMARY KEY, --主键ID SNAME VARCHAR2(20), ); 此时给学生表添加数 ...
-
jdbc连接mysql加载驱动程序com.mysql.jdbc.Driver
在开发环境如eclipse,中加载指定数据库的驱动程序.需要下载MySQL支持JDBC的驱动程序mysql-connector-java-5.1.25-bin.jar. 而具体在Java程序中加载驱动 ...