原题传送门
可以很套路地得到一个结论,答案与月票的路径有一段连续的重复路径
以 s , t , u , v s,t,u,v s,t,u,v为起点跑四次最短路
现在我们枚举两个月票最短路上的点 x , y x,y x,y
a n s = m i n ( a n s , d i s u [ x ] + d i s v [ y ] , d i s u [ y ] + d i s v [ x ] ) ans=min(ans,dis_u[x]+dis_v[y],dis_u[y]+dis_v[x]) ans=min(ans,disu​[x]+disv​[y],disu​[y]+disv​[x])
对于一个 x x x, d i s u [ x ] , d i s v [ x ] dis_u[x],dis_v[x] disu​[x],disv​[x]是确定的,可以dp出 d i s u [ y ] , d i s v [ y ] dis_u[y],dis_v[y] disu​[y],disv​[y]

令 f x f_x fx​表示从 x x x到 v v v的最短路
g x g_x gx​表示从 x x x到 u u u的最短路
遍历最短路上的点 y y y
f x = m i n ( f x , f y ) , g x = m i n ( g x , g y ) f_x=min(f_x,f_y),g_x=min(g_x,g_y) fx​=min(fx​,fy​),gx​=min(gx​,gy​)

Code:

#include <bits/stdc++.h>
#define maxn 200010
#define LL long long
using namespace std;
const LL inf = 1e15;
struct heap{int node;LL len;bool operator < (const heap &x) const{return x.len < len;}
};
priority_queue <heap> q;
struct Edge{int to, next, len;
}edge[maxn << 1];
int num, head[maxn], vis[maxn], n, m, S, T, U, V;
LL dU[maxn], dV[maxn], dS[maxn], dT[maxn], f[maxn], g[maxn], ans;inline int read(){int s = 0, w = 1;char c = getchar();for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);return s * w;
}void addedge(int x, int y, int z){edge[++num] = (Edge){y, head[x], z}, head[x] = num;
}void dijk(int st, LL *dis){for (int i = 1; i <= n; ++i)vis[i] = 0, dis[i] = inf;dis[st] = 0;q.push((heap){st, 0});while (!q.empty()){int u = q.top().node; q.pop();if (vis[u]) continue;vis[u] = 1;for (int i = head[u]; i; i = edge[i].next){int v = edge[i].to;if (dis[v] > dis[u] + edge[i].len){dis[v] = dis[u] + edge[i].len;if (!vis[v]) q.push((heap){v, dis[v]});}}}
}void dfs(int u){if (vis[u]) return;vis[u] = 1;f[u] = dV[u], g[u] = dU[u];for (int i = head[u]; i; i = edge[i].next){int v = edge[i].to;if (dS[u] + dT[v] + edge[i].len > dS[T]) continue;dfs(v);f[u] = min(f[u], f[v]), g[u] = min(g[u], g[v]);}ans = min(ans, min(f[u] + dU[u], g[u] + dV[u]));
}int main(){n = read(), m = read();S = read(), T = read(), U = read(), V = read();for (int i = 1; i <= m; ++i){int x = read(), y = read(), z = read();addedge(x, y, z), addedge(y, x, z);}dijk(S, dS), dijk(T, dT), dijk(U, dU), dijk(V, dV);ans = dU[V];
//  printf("%lld\n", ans);for (int i = 1; i <= n; ++i) vis[i] = 0;dfs(S);printf("%lld\n", ans);return 0;
}

【题解】LOJ2350:「JOI 2018 Final」月票购买相关推荐

  1. 【2018.10.1】「JOI 2014 Final」年轮蛋糕

    题面 一看到求"最小值的最大值"这种问题,就能想到二分了. 二分答案,然后我们要把一圈分成三块,使这三块的大小都$\geq mid$.做法是把环展开成2倍长度的链,先钦定一个起点, ...

  2. 【题解】LOJ3254:「JOI 2020 Final」集邮比赛 3

    原题传送门 发现 n < = 200 n<=200 n<=200,那么我们就可以想一个 O ( n 3 ) O(n^3) O(n3)的dp 发现每次肯定是向左/右推进 可以令 d p ...

  3. 「JOI 2016 Final」断层

    嘟嘟嘟 今天我们模拟考这题,出的是T3.实在是没想出来,就搞了个20分暴力(还WA了几发). 这题关键在于逆向思维,就是考虑最后的\(n\)的个点刚开始在哪儿,这样就减少了很多需要维护的东西. 这就让 ...

  4. Luogu P5103 「JOI 2016 Final」断层 树状数组or线段树+脑子

    太神仙了这题... 原来的地面上升,可以倒着操作(时光倒流),转化为地面沉降,最后的答案就是每个点的深度. 下面的1,2操作均定义为向下沉降(与原题意的变换相反): 首先这个题目只会操作前缀和后缀,并 ...

  5. T3:LOJ2332「JOI 2017 Final」焚风现象.cpp

    记录差值 然后每次运算一下头和尾 如果尾端是最后一次增加则不用运算尾端 详见代码 #include<iostream> #include<cstdio> #include< ...

  6. Libre OJ P2332「JOI 2017 Final」焚风现象【差分思想】By cellur925

    题目传送门 这道题开始看起来会很晕...\(qwq\).首先我们要明确题目中的海拔&&温度.温度是受海拔影响的,每次改变的是海拔,我们求的是温度. 我们开始读入的时候便可以处理出开始\ ...

  7. 「SCOI 2018 D2T1」Pipi 酱的日常

    传送门 problem 给定 nnn 个数,第 i(1≤i≤n)i(1\le i\le n)i(1≤i≤n) 个位置上的值为 xix_ixi​,有 mmm 个操作,操作有以下两种: 1 pos v:将 ...

  8. 「CSP-S模拟赛」2019第四场

    「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...

  9. 「JOISC 2018 Day 3」比太郎的聚会

    「JOISC 2018 Day 3」比太郎的聚会 题意: ​ 给你一个\(DAG\),若干组询问,每次给出一个终点和若干个点,问从给出点以外的点出发,到达终点的最长路.(\(|V|\leq 1e5 | ...

最新文章

  1. Selenium3自动化测试——15.调用Javascript进行滚动条控制
  2. VSCode + Latex 配置
  3. 让ABAP开发者更加轻松的若干快捷键
  4. How to handle the generic error Cannot read property md of undefined
  5. Java如何定义三个圆_java – 以编程方式查找三个圆的交叉点
  6. Struts2 OGNL
  7. 32利用文件系统保存数据_网易技术实践|Docker文件系统实战
  8. 【JQGRID DOCUMENTATION】.学习笔记.5.Form Editing
  9. 需要写的一些pycoe
  10. MySQL的Limit子句
  11. 【clickhouse】ClickHouseException code: 225 ZooKeeper session has been expired
  12. ssm如何支持热部署_IntelliJ IDEA基于SpringBoot如何搭建SSM开发环境
  13. 字符串,列表,元组,字典基本函数
  14. Linux系统重要快捷键 Shell 常用通配符
  15. 语义分析的方法简述之文本基本处理
  16. 特教学校计算机课,特教学校引入编程课 为听障孩子打开智能之门
  17. python导出pdf文件怎么只有一页_python利用PyPDF2拆分pdf文件成单页
  18. 2010 年全国大学生数学建模竞赛甘肃赛区 获奖情况
  19. springboot配置文件密文解密
  20. 腾讯云docker部署halo个人博客及myql数据库笔记

热门文章

  1. day 12 生成器和生成器函数以及各种推导式
  2. 面向对象编程的三个基本特征
  3. c语言struct用法
  4. mysql in和exists性能比较和使用
  5. tomcat无法访问webapps下的项目问题
  6. FastReport处理打印空项问题
  7. 教你如何用支付宝测试扫一扫付钱功能
  8. MyEclipse 2014 GA Windows版下载地址
  9. 苹果笔记本(Macbook)删除OS X系统 安装win7方法【MacBook Pro/air Mac OS X】
  10. 苹果新手Mac OS X 使用笔记--------系统目录结构