LOJ2350:[JOI2017/2018决赛]月票购买——题解
比较简单的题,为什么我实现得这么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决赛]月票购买——题解的更多相关文章
- LOJ2351:[JOI2017/2018决赛]毒蛇越狱——题解
https://loj.ac/problem/2351 参考:https://www.cnblogs.com/ivorysi/p/9144676.html 但是参考博客讲解太吓人了,我们换一种通俗易懂 ...
- [JOI2017/2018]美術展
[JOI2017/2018]美術展 题目大意: 有\(n(n\le5\times10^5)\)个物品,每个物品有两个属性:尺寸\(A_i\)和收益\(B_i\).从中选取一个子集,总收益为\(\sum ...
- 【LOJ】#2350. 「JOI 2017/2018 决赛」月票购买
题解 首先求一个最短路图出来,最短路图就是这条边在最短路上就保留,否则就不保留,注意最短路图是一个有向图,一条边被保留的条件是 dis(S,u) + val(u,v) = dis(v,T)我们需要求两 ...
- 2018湘潭邀请赛 AFK题解 其他待补...
A.HDU6276:Easy h-index Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- 洛谷P1108 低价购买题解
看到"你必须用低于你上次购买它的价格购买它",有没有想到什么?没错,又是LIS,倒过来的LIS,所以我们只要把读入的序列倒过来就可以求LIS了,第一问解决. 首先要厘清的是,对于这 ...
- Tsinghua 2018 DSA PA2简要题解
反正没时间写,先把简要题解(嘴巴A题)都给他写了记录一下. upd:任务倒是完成了,我也自闭了. CST2018 2-1 Meteorites: 乘法版的石子合并,堆 + 高精度. 写起来有点烦貌似. ...
- 【LOJ】#2349. 「JOI 2017/2018 决赛」团子制作
题解 有意思的一个dp,我们对G计数,发现如果不在同一条对角线上的G肯定不会互相影响,所以我们对于每一条对角线dp dp的方式是枚举这个G以什么方式放,横着还是竖着,还是不放 代码 #include ...
- 【LOJ】#2351. 「JOI 2017/2018 决赛」毒蛇越狱
题解 没啥特别好的算法,是个讨论题,由于0 1 ?三类数位中最少的不会超过6 如果1不超过6,那么记录\(f1(S)\)为 \(\sum_{T \subset S} val(T)\)这个可以通过类似F ...
- BZOJ4004:[JLOI2015]装备购买——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4004 https://www.luogu.org/problemnew/show/P3265 脸哥 ...
随机推荐
- hdu1421搬寝室(动态规划)
搬寝室 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- Selenium 入门到精通系列:一
Selenium 入门到精通系列 PS:控制浏览器窗口大小.前进.后退.刷新 例子 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 20 ...
- myeclipse tomcat部署按钮点击没反应
进入workspace目录,删除.metadata\.plugins\org.eclipse.core.runtime\.settings\com.genuitec.eclipse.ast.deplo ...
- 前端开发工程师 - 01.页面制作 - 第3章.HTML
第3章--HTML HTML简介 Hyper Text Markup Language:超文本标记语言--用于标记网页的内容 history: html(1991)雏形 -> html4.01( ...
- flume 整合 kafka
flume 整合 kafka: flume:高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统. kafka:分布式的流数据平台. flume 采集业务日志,发送到kafka 一. ...
- 博客更换至 www.zhaoch.top
博客更换至 www.zhaoch.top 随手拷了一些链接 http://www.zhaoch.top/操作系统/linux/常用命令备忘.html http://www.zhaoch.top/操作系 ...
- 【WXS数据类型】Object
Object 是一种无序的键值对. 属性: 名称 值类型 说明 [Object].constructor [String] 返回值为“Object”,表示类型的结构字符串 方法: 原型:[Object ...
- 209. First Unique Character in a String
Description Find the first unique character in a given string. You can assume that there is at least ...
- 线性代数之——微分方程和 exp(At)
本节的核心是将常系数微分方程转化为线性代数问题. \[\frac{du}{dt}=\lambda u \quad 的解为 \quad u(t) = Ce^{\lambda t}\] 代入 \(t=0\ ...
- v-if或者v-repeat等不起作用
v-if或者v-for等不起作用 在项目中,有时遇到了v-if或v-for等形式时,页面没起作用.以下可能是出现这些问题的原因: 1.绑定值是接口返回的某个属性值,而这个属性值不存在data()中,这 ...