[GX/GZOI2019]旅行者(dijkstra)
二进制分组SB做法没意思还难写还可能会被卡常其实是我不会写。用一种比较优秀的O(Tnlogn)做法,只需要做2次dijkstra。对原图做一次、对反图做一次,然后记录每个点的最短路是从k个源点中的哪个转移过来的。然后枚举每条边,若两边转移过来的源点不同,则用d1+w[i]+d2来更新答案即可。
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int N=1e5+,M=5e5+;
- struct node{int u;ll d;};
- bool operator<(node a,node b){return a.d>b.d;}
- int n,m,k,tot,a[N],vis[N],hd[N],v[M],nxt[M],w[M],st[M],ed[M],len[M],c[][N];
- ll ans,d[][N];
- void adde(int x,int y,int z){v[++tot]=y,nxt[tot]=hd[x],w[tot]=z,hd[x]=tot;}
- void dijkstra(ll*d,int*c)
- {
- priority_queue<node>q;
- for(int i=;i<=n;i++)d[i]=1e18,vis[i]=;
- for(int i=;i<=k;i++)d[a[i]]=,c[a[i]]=a[i],q.push((node){a[i],});
- while(!q.empty())
- {
- int u=q.top().u;q.pop();
- if(vis[u])continue;
- vis[u]=;
- for(int i=hd[u];i;i=nxt[i])
- if(d[v[i]]>d[u]+w[i])d[v[i]]=d[u]+w[i],c[v[i]]=c[u],q.push((node){v[i],d[v[i]]});
- }
- }
- int main()
- {
- int T;scanf("%d",&T);
- while(T--)
- {
- scanf("%d%d%d",&n,&m,&k);
- for(int i=;i<=n;i++)hd[i]=;tot=;
- for(int i=,x,y,z;i<=m;i++)
- {
- scanf("%d%d%d",&x,&y,&z);
- if(x==y)i--,m--;
- else adde(x,y,z),st[i]=x,ed[i]=y,len[i]=z;
- }
- for(int i=;i<=k;i++)scanf("%d",&a[i]);
- dijkstra(d[],c[]);
- for(int i=;i<=n;i++)hd[i]=;tot=;
- for(int i=;i<=m;i++)adde(ed[i],st[i],len[i]);
- dijkstra(d[],c[]);
- ans=1e18;
- for(int i=;i<=m;i++)
- if(c[][st[i]]&&c[][ed[i]]&&c[][st[i]]!=c[][ed[i]])
- ans=min(ans,d[][st[i]]+d[][ed[i]]+len[i]);
- printf("%lld\n",ans);
- }
- }
[GX/GZOI2019]旅行者(dijkstra)的更多相关文章
- [LOJ3087][GXOI/GZOI2019]旅行者——堆优化dijkstra
题目链接: [GXOI/GZOI2019]旅行者 我们考虑每条边的贡献,对每个点求出能到达它的最近的感兴趣的城市(设为$f[i]$,最短距离设为$a[i]$)和它能到达的离它最近的感兴趣的城市(设为$ ...
- GX/GZOI2019 day2 解题报告
GX/GZOI2019 day2 解题报告 题目链接 逼死强迫症 旅行者 旧词 t1 逼死强迫症 显然地,记 \(f(i)\) 为长度为 \(i\) 的木板的答案,可得: \(\\\) \[f(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 只对 ...
- BZOJ5506 GXOI/GZOI2019旅行者(最短路)
本以为是个二进制分组傻逼题https://www.cnblogs.com/Gloid/p/9545753.html,实际上有神仙的一个log做法https://www.cnblogs.com/asul ...
- [GXOI/GZOI2019]旅行者
就我感觉这道题很神仙吗/kel 仔细想想应该也是一种适用范围挺广的做法. 考虑我们可以通过dijkstra在O(nlogn)求出一个点集到另外一个点集的最短路. 那么我们可以通过一些划分点集的方式使得 ...
- bzoj5506:[gzoi2019]旅行者
传送门 正反两边dijkstra染色,然后枚举一下边,求出最小值就好啦 代码: #include<cstdio> #include<iostream> #include< ...
- P5304 [GXOI/GZOI2019]旅行者(最短路/乱搞)
luogu bzoj Orz自己想出神仙正解的sxy 描述略 直接把所有起点推进去跑dijkstra... 并且染色,就是记录到这个点的最短路是由哪个起点引导出来的 然后再把所有边反指跑一次... 之 ...
随机推荐
- JS照片轮换
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 干货分享:Essay Introduction的正确打开方式
其实在学术essay写作过程中,很多留学生经常不知道如何写introduction,所以有些开头的模板句就出现了,比如,With the development of society/With the ...
- 实验吧Web-易-天网管理系统(php弱类型,==号)
打开网页,查看源码,看到 <!-- $test=$_GET['username']; $test=md5($test); if($test=='0') --> 说明用户名需要加密之后为0. ...
- LVM中逻辑卷的最大大小限制
前言: 本文是对这篇博客Maximum Size Of A Logical Volume In LVM的翻译,敬请尊重原创和翻译劳动成果,那些随意转载的大爷们,好歹也自觉注明出处.谢谢! 英文原文地址 ...
- 尝试用kotlin做一个app(写在前面)
学kotlin的目的好像就是做一个app,不一定有什么想做的项目,只是单纯想掌握这一门技术,确切地说只是单纯想学会做app.对于概念的东西,我也没兴趣深究,用得到的学一下,用不到的,就算了.我也不知道 ...
- VEH&VCH
本文99.9%的代码及内容作者:mengwuji 来自:http://www.mengwuji.net/forum.php?mod=viewthread&tid=1371 VEH:向量化异常处 ...
- Delphi生成即调用带窗体的Dll
library frmDll; { Important note about DLL memory management: ShareMem must be the first unit in you ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL LIKE 子句
在 MySQL 中使用 SQL SELECT 命令来读取数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录. WHERE 子句中可以使用等号 = 来设定获取数据的条件, ...
- 排序算法 python实现
一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两 ...
- TextView和Button的学习
常用属性,界面跳转,按钮学习,按压颜色的变换,图片的插入学习等 工程目录: MainActivity.java: package com.example.revrse; import androidx ...