P5304 [GXOI/GZOI2019]旅行者(最短路/乱搞)
Orz自己想出神仙正解的sxy
描述略
直接把所有起点推进去跑dijkstra...
并且染色,就是记录到这个点的最短路是由哪个起点引导出来的
然后再把所有边反指跑一次...
之后枚举每一条边两边的点不同色就可以更新答案
这个可能少有的代码比说得清楚...
#include<cstdio> #include<queue> #include<algorithm> using std::min; using std::priority_queue; typedef long long lint; ,M=; template<typename tp>inline void read(tp &kk) { tp ret=,f=;char ch=getchar(); ;ch=getchar();} +ch-';ch=getchar();} kk=ret*f; } int n,m,k; struct sumireko{int to,ne;lint v;}e[M]; int he[N],ecnt; void addline(int f,int t,lint v) { if(f==t) return; e[++ecnt].to=t; e[ecnt].ne=he[f]; e[ecnt].v=v; he[f]=ecnt; } int X[M],Y[M],l[N];lint V[M]; lint d[][N];][N]; struct shino{ lint di;int id; shino(){} shino(int ii,lint dd){id=ii,di=dd;} bool friend operator < (shino a,shino b){return a.di>b.di;} }g; priority_queue<shino>q; bool vv[N]; void dijkstra(lint *dis,int *c) { ;i<=n;i++) dis[i]=0x3f3f3f3f3f3f3f3f; ;i<=k;i++) dis[l[i]]=,c[l[i]]=l[i],q.push(shino(l[i],)); while(!q.empty()) { g=q.top(); q.pop(); int x=g.id; vv[x]=; for(int i=he[x],t;i;i=e[i].ne) { t=e[i].to; if(vv[t]) continue; if(dis[t]>dis[x]+e[i].v) { dis[t]=dis[x]+e[i].v; c[t]=c[x]; q.push(shino(t,dis[t])); } } } } ;i<=n;i++) he[i]=,vv[i]=;ecnt=;} int xi,yi,vi,T; int main() { read(T); while(T--) { read(n),read(m),read(k); ;i<=m;i++) read(X[i]),read(Y[i]),read(V[i]),addline(X[i],Y[i],V[i]); ;i<=k;i++) read(l[i]); dijkstra(d[],fa[]); clr(); ;i<=m;i++) addline(Y[i],X[i],V[i]); dijkstra(d[],fa[]); lint ans=0x3f3f3f3f3f3f3f3f; ;i<=m;i++) { xi=X[i],yi=Y[i],vi=V[i]; ][xi]&&fa[][yi]&&(fa[][xi]^fa[][yi])) { ans=min(ans,d[][xi]+vi+d[][yi]); } } printf("%lld\n",ans); clr(); } ; }
哭唧唧
P5304 [GXOI/GZOI2019]旅行者(最短路/乱搞)的更多相关文章
- 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 ...
- luogu P5304 [GXOI/GZOI2019]旅行者
传送门 所以这个\(5s\)是SMG 暴力是枚举每一个点跑最短路,然后有一个很拿衣服幼稚的想法,就是把所有给出的关键点当出发点,都丢到队列里,求最短路的时候如果当前点\(x\)某个相邻的点\(y\)是 ...
- 【题解】Luogu P5304 [GXOI/GZOI2019]旅行者
原题传送门 题意:给你k个点,让你求两两最短路之间的最小值 我们考虑二进制拆分,使得每两个点都有机会分在不同的组\((A:0,B:1)\)中,从源点\(S\)向\(A/B\)中的点连边权为0的边,从\ ...
- [洛谷P5304][GXOI/GZOI2019]旅行者
题目大意: 有一张 \(n(n\leqslant10^5)\) 个点 \(m(m\leqslant5\times10^5)\) 条边的有向有正权图,有$k(2\leqslant k\leqslant ...
- 【BZOJ5506】[GXOI/GZOI2019]旅行者(最短路)
[BZOJ5506][GXOI/GZOI2019]旅行者(最短路) 题面 BZOJ 洛谷 题解 正着做一遍\(dij\)求出最短路径以及从谁转移过来的,反过来做一遍,如果两个点不由同一个点转移过来就更 ...
- [LOJ3087][GXOI/GZOI2019]旅行者——堆优化dijkstra
题目链接: [GXOI/GZOI2019]旅行者 我们考虑每条边的贡献,对每个点求出能到达它的最近的感兴趣的城市(设为$f[i]$,最短距离设为$a[i]$)和它能到达的离它最近的感兴趣的城市(设为$ ...
- [GXOI/GZOI2019]旅行者 (最短路)
题意 给定一个有向图,其中一些顶点为关键点.求这些关键点两两之间最小距离. 题解 考试时没怎么想写了50分暴力走了.以为是什么强连通分量的解法,结果就是个最短路.直接从关键点跑一次最短路dis[0], ...
- BZOJ5506 GXOI/GZOI2019旅行者(最短路)
本以为是个二进制分组傻逼题https://www.cnblogs.com/Gloid/p/9545753.html,实际上有神仙的一个log做法https://www.cnblogs.com/asul ...
随机推荐
- Ruby IO类
更新: 2017/06/23 表格大小全部改为100% 文件输入输出的File....系列函数的文件名参数是字符串! 更新: 2017/06 ...
- Hibernate对集合属性的操作---基础学习
1:Set集合属性操作 1).Hibernate3以后支持大部分重要的JDK集合接口映射,Set集合接口的配置: >在xxx.hbm.xml文件中使用<set>标签 2).< ...
- 洛谷 P1606 [USACO07FEB]荷叶塘Lilypad Pond【spfa】
和bzoj同名题不一样! 起点和水点向花费一个荷花能到的第一个点连一条边权为1的有向边,然后跑计数spfa即可 #include<iostream> #include<cstdio& ...
- bzoj 2561: 最小生成树【最小割】
看错题了以为多组询问吓得不行-- 其实还挺好想的,就是数据范围一点都不网络流.把U作为s,V作为t,以最小生成树为例,(U,V,L)要在最小生成树上,就要求所有边权比L小的边不能连通(U,V)所在的联 ...
- Ubuntu 18 安装 wps
本来有三种方法 1. 软件中心 安装最简单 2. 命令行snap 安装 如果没有安装snap 先安装 sudo apt install snapd 然后安装wps sudo snap install ...
- Qt事件系统之三:键盘事件
QKeyEvent类用来描述一个键盘事件.当键盘按键被按下或者被释放时,键盘事件便会被发送给拥有键盘输人焦点的部件. QKeyEvent的key()函数可以获取具体的按键,对于Qt中给定的所有按键,可 ...
- DP UVALive 6506 Padovan Sequence
题目传送门 /* 题意:两行数字,相邻列一上一下,或者隔一列两行都可以,从左到右选择数字使和最大 DP:状态转移方程:dp[i][j] = max (dp[i][j], dp[1-i][j-1] + ...
- 题解报告:hdu 1114 Piggy-Bank(完全背包恰好装满)
Problem Description Before ACM can do anything, a budget must be prepared and the necessary financia ...
- 455 Assign Cookies 分发饼干
假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干.对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸:并且每块饼干 j ,都有一个尺寸 ...
- 219 Contains Duplicate II 存在重复 II
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使 nums [i] = nums [j],并且 i 和 j 的绝对差值最大为 k. 详见:https://leetcod ...