luogu P5304 [GXOI/GZOI2019]旅行者
传送门
所以这个\(5s\)是SMG
暴力是枚举每一个点跑最短路,然后有一个很拿衣服幼稚的想法,就是把所有给出的关键点当出发点,都丢到队列里,求最短路的时候如果当前点\(x\)某个相邻的点\(y\)是关键点,就用\(dis_x+\)边权\(w_i\)更新答案.感觉这个复杂度是正确的,然后跑一下样例也对
交上去就可以获得70'的好成绩
这个方法会有一种特殊情况无法处理,就是这条路径的起点和终点都是同一点,因为图中可能有环.那么我们更新答案就不能用起点是\(y\)的路径更新答案,于是考虑同时记录从某个出发点到一个点的最短路以及是从哪个出发点转移过来的,同时求次短路,要求最短路的起点和次短路起点不一样,那么在更新答案时,如果最短路起点不等于终点就用最短路更新,否则用次短路
// luogu-judger-enable-o2
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<cmath>
#include<ctime>
#include<queue>
#include<map>
#include<set>
#define LL long long
#define db doubleusing namespace std;
const int N=100000+10,M=500000+10;
int rd()
{int x=0,w=1;char ch=0;while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}return x*w;
}
int to[M],nt[M],hd[N],tot;
LL w[M];
void add(int x,int y,int z){++tot,to[tot]=y,nt[tot]=hd[x],w[tot]=z,hd[x]=tot;}
bool v[N];
struct nn
{LL d;int y;void clr(){d=1ll<<50,y=0;}bool operator < (const nn &bb) const {return d<bb.d;}
}d1[N],d2[N];
struct node
{int x;nn d1,d2;bool operator < (const node &bb) const {return bb.d1.d!=d1.d?bb.d1<d1:bb.d2<d2;}
};
priority_queue<node> q;
int n,m,kk;int main()
{int T=rd();while(T--){memset(hd,0,sizeof(hd)),tot=0;n=rd(),m=rd(),kk=rd();for(int i=1;i<=m;++i){int x=rd(),y=rd(),z=rd();if(x==y) continue;add(x,y,z);}memset(v,0,sizeof(v));for(int i=1;i<=n;++i) d1[i].clr(),d2[i].clr();LL ans=1ll<<50;while(kk--){int x=rd();d1[x]=(nn){0,x},v[x]=1,q.push((node){x,d1[x],d2[x]});}while(!q.empty()){int x=q.top().x;nn dd1=q.top().d1,dd2=q.top().d2;q.pop();if(d1[x]<dd1||d2[x]<dd2) continue;for(int i=hd[x];i;i=nt[i]){int y=to[i];if(v[y]){if(dd1.y!=y) ans=min(ans,dd1.d+w[i]);else ans=min(ans,dd2.d+w[i]);}else{nn n1=d1[y],n2=d2[y];if(n1.d>dd2.d+w[i]){if(n1.y!=n2.y) n2=n1;n1=(nn){dd2.d+w[i],dd2.y};}else if(n2.d>dd2.d+w[i]&&n1.y!=dd2.y) n2=(nn){dd2.d+w[i],dd2.y};if(n1.d>dd1.d+w[i]){if(n1.y!=n2.y) n2=n1;n1=(nn){dd1.d+w[i],dd1.y};}else if(n2.d>dd1.d+w[i]&&n1.y!=dd1.y) n2=(nn){dd1.d+w[i],dd1.y};if(n1<d1[y]||n2<d2[y]) q.push((node){y,d1[y]=n1,d2[y]=n2});}}}printf("%lld\n",ans);}return 0;
}
转载于:https://www.cnblogs.com/smyjr/p/10763331.html
luogu P5304 [GXOI/GZOI2019]旅行者相关推荐
- GXOI/GZOI2019题解
GXOI/GZOI2019题解 P5300 [GXOI/GZOI2019]与或和 一眼题.. 显然枚举每个二进制位,答案就变成了全1子矩阵数量. 这个xjb推推,单调栈一下就行了. #include& ...
- [GXOI/GZOI2019]旧词——树链剖分+线段树
题目链接: [GXOI/GZOI2019]旧词 对于$k=1$的情况,可以参见[LNOI2014]LCA,将询问离线然后从$1$号点开始对这个点到根的路径链修改,每次询问就是对询问点到根路径链查询即可 ...
- [数据结构专训][GXOI/GZOI2019]旧词,[hdu5118]GRE Words Once More!,[hdu6333]Problem B. Harvest of Apples
文章目录 T1:[GXOI/GZOI2019]旧词 solution code T2:GRE Words Once More! solution code T3:Problem B. Harvest ...
- 【LOJ】#3086. 「GXOI / GZOI2019」逼死强迫症
LOJ#3086. 「GXOI / GZOI2019」逼死强迫症 这个就是设状态为\(S,j\)表示轮廓线为\(S\),然后用的1×1个数为j 列出矩阵转移 这样会算重两个边相邻的,只要算出斐波那契数 ...
- 【题解】Luogu-P5303 [GXOI/GZOI2019]逼死强迫症
P5303 [GXOI/GZOI2019]逼死强迫症 Preface 矩阵题的登峰造极之作. Description 有 TTT 组数据. 对于每组数据,给定正整数 NNN,请求出用 (N−1)(N- ...
- 【详●析】[GXOI/GZOI2019]逼死强迫症
[详●析][GXOI/GZOI2019]逼死强迫症 脑子不够用了... [题目大意] 在\(2\times N\)的方格中用\(N-1\)块\(2\times 1\)的方砖和\(2\)块\(1\tim ...
- P5303 [GXOI/GZOI2019]逼死强迫症 题解
P5303 [GXOI/GZOI2019]逼死强迫症 P5303 [GXOI/GZOI2019]逼死强迫症 说实在的这题不难,但是我推 Dp\tt DpDp 的时候却只和正解相差一点,最后还是看了题解 ...
- P5304-[GXOI/GZOI2019]旅行者【最短路】
正题 题目链接:https://www.luogu.com.cn/problem/P5304 题目大意 nnn个点mmm条边的一张有向图,有kkk个关键点,求距离最短的一对关键点. 解题思路 我们能够 ...
- [GXOI/GZOI2019]宝牌一大堆(dp)
luogu bzoj 这个麻将题还算挺友善的,比隔壁zjoi的要好得多... 比较正常的做法是五维dp 但事实上六维dp也是完全不会被卡的 七对子选权值最高的七个,国士无双直接$13^2$暴力 ...
最新文章
- Linux 系统之软件管理
- 这些css高级技巧,你知道几个呢
- python3 csv读写_在python3中读取、更新和写入更新的CSV文件
- 作为产品,看我是如何把技术逼疯的...
- 软件工程——快速掌握面向对象开发方法
- 你可能不知道console强大
- jsp中给div加背景_web前端入门到实战:详解css3如何给背景图片加颜色遮罩
- 罗马java_罗马数字转换工具-java
- GPIO 模拟SPI
- java 异常 ppt_Java程序设计基础与实践 第6章 异常处理.ppt
- python实现:将一个四位数反向输出
- 南京美食指南(完美篇)
- fm24c16c语言程序,单片机读写24C01~24C16程序
- Java 把jpg图片合成gif格式动态图片
- kindeditor html上传本地图片
- 知名电商购物车架构流程图
- Sanity Check: SRM, AA test
- Spring框架概述
- 怎么简单刷机?安卓刷机的使用教程
- 游戏策划游戏研发必读经典题文二