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. hdu1421搬寝室(动态规划)

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  2. Selenium 入门到精通系列:一

    Selenium 入门到精通系列 PS:控制浏览器窗口大小.前进.后退.刷新 例子 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 20 ...

  3. myeclipse tomcat部署按钮点击没反应

    进入workspace目录,删除.metadata\.plugins\org.eclipse.core.runtime\.settings\com.genuitec.eclipse.ast.deplo ...

  4. 前端开发工程师 - 01.页面制作 - 第3章.HTML

    第3章--HTML HTML简介 Hyper Text Markup Language:超文本标记语言--用于标记网页的内容 history: html(1991)雏形 -> html4.01( ...

  5. flume 整合 kafka

    flume 整合 kafka:   flume:高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统. kafka:分布式的流数据平台.   flume 采集业务日志,发送到kafka   一. ...

  6. 博客更换至 www.zhaoch.top

    博客更换至 www.zhaoch.top 随手拷了一些链接 http://www.zhaoch.top/操作系统/linux/常用命令备忘.html http://www.zhaoch.top/操作系 ...

  7. 【WXS数据类型】Object

    Object 是一种无序的键值对. 属性: 名称 值类型 说明 [Object].constructor [String] 返回值为“Object”,表示类型的结构字符串 方法: 原型:[Object ...

  8. 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 ...

  9. 线性代数之——微分方程和 exp(At)

    本节的核心是将常系数微分方程转化为线性代数问题. \[\frac{du}{dt}=\lambda u \quad 的解为 \quad u(t) = Ce^{\lambda t}\] 代入 \(t=0\ ...

  10. v-if或者v-repeat等不起作用

    v-if或者v-for等不起作用 在项目中,有时遇到了v-if或v-for等形式时,页面没起作用.以下可能是出现这些问题的原因: 1.绑定值是接口返回的某个属性值,而这个属性值不存在data()中,这 ...