https://loj.ac/problem/2350

比较简单的题,为什么我实现得这么sb?

第一个包其实已经给了提示(第一个包的解法就是在S->T所有最短路径上的所有点到V的最短路的最小值。)

那么我们先把所有最短路径存成新的图,然后dfs每一条路径,然后找到路径上两个点(i,j),构成一条U->i->j->V,把所有这样的路的答案更新即为所求。

然后就是代码实现的问题了,dfs肯定不行,那么考虑开两个数组f[i]和t[i]表示i往后的路径点j中,U->j最小值和j->V最小值。

那么答案就是min(U->i+t[i],f[i]+i->V)。

也就是说我们需要从T往S推f[i]和t[i],那么就一遍dfs,最后再将当前点加入队列,则点顺序正好满足推的过程。

#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;
typedef long long ll;
typedef pair<ll,int>pii;
typedef __gnu_pbds::priority_queue<pii,greater<pii>,__gnu_pbds::pairing_heap_tag> heap;
#define fi first
#define se second
const int N=1e5+;
const int M=2e5+;
const ll INF=1e18;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct node{
int cnt,head[N];
int w[M*],to[M*],nxt[M*];
node(){
cnt=;memset(head,,sizeof(head));
}
inline void add(int u,int v,int k){
to[++cnt]=v;w[cnt]=k;nxt[cnt]=head[u];head[u]=cnt;
}
}e,f;
int n,m,S,T,U,V;
ll dis[][N];
heap q;
heap::point_iterator id[N];
void dij(int s,int on){
for(int i=;i<=n;i++)dis[on][i]=INF,id[i]=;
dis[on][s]=;id[s]=q.push(pii(,s));
while(!q.empty()){
int u=q.top().se;q.pop();
for(int i=e.head[u];i;i=e.nxt[i]){
int v=e.to[i],w=e.w[i];
if(dis[on][v]>dis[on][u]+w){
dis[on][v]=dis[on][u]+w;
if(id[v]!=)q.modify(id[v],pii(dis[on][v],v));
else id[v]=q.push(pii(dis[on][v],v));
}
}
}
return;
}
bool vis[N];
ll ans,mint[N],minf[N];
int dui[N],r;
inline int turn(int i){if(i&)return i+;return i-;}
void dfs(int u){
vis[u]=;
for(int i=f.head[u];i;i=f.nxt[i]){
int v=f.to[i];
if(!vis[v])dfs(v);
}
dui[++r]=u;
}
int main(){
n=read(),m=read();
S=read(),T=read(),U=read(),V=read();
for(int i=;i<=m;i++){
int u=read(),v=read(),w=read();
e.add(u,v,w);e.add(v,u,w);
}
dij(S,);dij(T,);dij(U,);dij(V,);
for(int i=;i<=e.cnt;i++){
int u=e.to[turn(i)],v=e.to[i],w=e.w[i];
if(dis[][u]+w+dis[][v]==dis[][T])f.add(u,v,);
}
ans=dis[][V];dfs(S);
for(int i=;i<=r;i++){
int u=dui[i];
minf[u]=dis[][u],mint[u]=dis[][u];
for(int j=f.head[u];j;j=f.nxt[j]){
int v=f.to[j];
minf[u]=min(minf[v],minf[u]);
mint[u]=min(mint[v],mint[u]);
}
ans=min(ans,min(minf[u]+dis[][u],dis[][u]+mint[u]));
}
printf("%lld\n",ans);
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

LOJ2350:[JOI2017/2018决赛]月票购买——题解的更多相关文章

  1. LOJ2351:[JOI2017/2018决赛]毒蛇越狱——题解

    https://loj.ac/problem/2351 参考:https://www.cnblogs.com/ivorysi/p/9144676.html 但是参考博客讲解太吓人了,我们换一种通俗易懂 ...

  2. [JOI2017/2018]美術展

    [JOI2017/2018]美術展 题目大意: 有\(n(n\le5\times10^5)\)个物品,每个物品有两个属性:尺寸\(A_i\)和收益\(B_i\).从中选取一个子集,总收益为\(\sum ...

  3. 【LOJ】#2350. 「JOI 2017/2018 决赛」月票购买

    题解 首先求一个最短路图出来,最短路图就是这条边在最短路上就保留,否则就不保留,注意最短路图是一个有向图,一条边被保留的条件是 dis(S,u) + val(u,v) = dis(v,T)我们需要求两 ...

  4. 2018湘潭邀请赛 AFK题解 其他待补...

    A.HDU6276:Easy h-index Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  5. 洛谷P1108 低价购买题解

    看到"你必须用低于你上次购买它的价格购买它",有没有想到什么?没错,又是LIS,倒过来的LIS,所以我们只要把读入的序列倒过来就可以求LIS了,第一问解决. 首先要厘清的是,对于这 ...

  6. Tsinghua 2018 DSA PA2简要题解

    反正没时间写,先把简要题解(嘴巴A题)都给他写了记录一下. upd:任务倒是完成了,我也自闭了. CST2018 2-1 Meteorites: 乘法版的石子合并,堆 + 高精度. 写起来有点烦貌似. ...

  7. 【LOJ】#2349. 「JOI 2017/2018 决赛」团子制作

    题解 有意思的一个dp,我们对G计数,发现如果不在同一条对角线上的G肯定不会互相影响,所以我们对于每一条对角线dp dp的方式是枚举这个G以什么方式放,横着还是竖着,还是不放 代码 #include ...

  8. 【LOJ】#2351. 「JOI 2017/2018 决赛」毒蛇越狱

    题解 没啥特别好的算法,是个讨论题,由于0 1 ?三类数位中最少的不会超过6 如果1不超过6,那么记录\(f1(S)\)为 \(\sum_{T \subset S} val(T)\)这个可以通过类似F ...

  9. BZOJ4004:[JLOI2015]装备购买——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4004 https://www.luogu.org/problemnew/show/P3265 脸哥 ...

随机推荐

  1. VDI数据恢复

    环境:cirtix xendesktop 问题:VDI无法正常启动,后台登录查看报错.多次重启无效果,客户部分数据存放在启动盘. 解决方法:1.创建一台新的VDI(必须保证关机)2.将原有VDI启动盘 ...

  2. 2019年猪年海报PSD模板-第五部分

    14套精美猪年海报,免费猪年海报,下载地址:百度网盘,https://pan.baidu.com/s/1CuZKPmFbbSBvzSXoCt2few                

  3. 「Python」matplotlib备忘录

    总结了一下网上现有的资源,得到了一些东西.随手做个备忘. 更多设置见:https://matplotlib.org/users/customizing.html. 导入 import matplotl ...

  4. centos7下搭建django

    安装环境:centos7.4 1 安装nginx yum install nginx 注:尝试过在本地和腾讯云上安装,使用同一条命令:在本地安装提示没有可用安装包,云上安装正常 启动nginx,并启用 ...

  5. Python|一文简单看懂 深度&广度 优先算法

    一.前言 以后尽量每天更新一篇,也是自己的一个学习打卡!加油!今天给大家分享的是,Python里深度/广度优先算法介绍及实现. 二.深度.广度优先算法简介 1. 深度优先搜索(DepthFirstSe ...

  6. lintcode142 O(1)时间检测2的幂次

    O(1)时间检测2的幂次 用 O(1) 时间检测整数 n 是否是 2 的幂次. 您在真实的面试中是否遇到过这个题? Yes 样例 n=4,返回 true; n=5,返回 false. 二进制的n中只有 ...

  7. KVM嵌套虚拟化

    1. 检查环境 $ grep -E 'svm|vmx' /proc/cpuinfo ~]#  lsmod | grep kvm kvm_intel             170181  0 kvm  ...

  8. 已有海外版Office365,如何开通相同Tenant的Azure

    下面这个步骤是开通海外版Azure的测试账号,请了解! 翻到如图位置 点击免费开始 下一步 输入验证代码,此页没截图 使用信用卡,需要visa或master 下一步认证完就可以使用,没有继续截图

  9. LeetCode - 326, 342, 231 Power of Three, Four, and Two

    1. 问题 231. Power of Two: 判断一个整数是否是2的n次方,其中n是非负整数 342. Power of Four: 判断一个整数是否是4的n次方,其中n是非负整数 326. Po ...

  10. POJ 1269 Intersecting Lines(直线求交点)

    Description We all know that a pair of distinct points on a plane defines a line and that a pair of ...