题解:设有一条边x->y,数组dis1[i]表示从1到i的最短距离,dis2[i]表示从n到i的最短距离。

1 如果说将x->y反向之前没有经过x->y,但是反向后我经过了x,y说明找到了一个更优的路径,那么反向后的答案就是dis1[y]+dis2[x]+(x,y),如果说反向后我没有经过

x->y,那也就是说x->y正向反向对dis[n]的结果没有影响喽。

2 如果说反向之前我经过了x->y,如果反向后没有经过x->y,那么此时的最短路也一定是大于等于dis1[n]的,因为会有一条新的路径长度处于dis1[n]和dis1[y]+dis2[x]+(x,y)之间。如果反向后经过了x->y,那么反向后的答案就是dis1[y]+dis2[x]+(x,y)。

综上所述,我们只需要判断dis1[y]+dis2[x]+(x,y)和dis1[n]的关系就行了。(看起来有点绕,仔细品品还是很有意思的)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=2e5+;
const ll INF=1e18+; struct stu{
ll a,b;
bool friend operator<(const stu &x,const stu &y){
return x.b>y.b;
}
};
vector<stu>ve1[N];
vector<stu>ve2[N];
ll l[N],r[N],w[N];
ll n,m;
bool mark[N];
ll dis1[N],dis2[N];
void add1(ll x,ll y,ll weight){
ve1[x].push_back({y,weight});
}
void add2(ll x,ll y,ll weight){
ve2[x].push_back({y,weight});
}
void inll(){
for(ll i=;i<=n;i++){
dis1[i]=dis2[i]=INF;
}
}
void djstrea1(ll s){
priority_queue<stu>que;
dis1[s]=;
que.push({s,});
while(que.size()){
stu xx=que.top();
que.pop();
if(mark[xx.a]==) continue ;
mark[xx.a]=;
for(ll i=;i<ve1[xx.a].size();i++){
ll dx=ve1[xx.a][i].a;
ll dy=ve1[xx.a][i].b;
if(mark[dx]==&&dis1[dx]>dis1[xx.a]+dy){
dis1[dx]=dis1[xx.a]+dy;
que.push({dx,dis1[dx]});
}
}
}
}
void djstrea2(ll s){
priority_queue<stu>que;
dis2[s]=;
que.push({s,});
while(que.size()){
stu xx=que.top();
que.pop();
if(mark[xx.a]==) continue ;
mark[xx.a]=;
for(ll i=;i<ve2[xx.a].size();i++){
ll dx=ve2[xx.a][i].a;
ll dy=ve2[xx.a][i].b;
if(mark[dx]==&&dis2[dx]>dis2[xx.a]+dy){
dis2[dx]=dis2[xx.a]+dy;
que.push({dx,dis2[dx]});
}
}
}
}
int main(){
cin>>n>>m;
inll();
for(ll i=;i<=m;i++){
ll x,y,z;
cin>>x>>y>>z;
l[i]=x;r[i]=y;w[i]=z;
add1(x,y,z);
add2(y,x,z);
}
djstrea1();
memset(mark,,sizeof mark);
djstrea2(n);
ll t;
cin>>t;
while(t--){
ll i;cin>>i;
cout<<(dis1[n]>dis1[r[i]]+dis2[l[i]]+w[i]? "YES":"NO")<<endl;
}
return ;
}

最短路变短了 (思维+反向djstrea)的更多相关文章

  1. luogu 4366 [Code+#4]最短路 Dijkstra + 位运算 + 思维

    这个题思路十分巧妙,感觉很多题都有类似的套路. 我们发现异或操作其实就是将一个数的二进制的若干个 $0$ 变成 $1$,或者一些 $1$ 变成 $0$. 而每次按照某种顺序一位一位地异或也可以起到同时 ...

  2. mysql变成类型字段varchar值更新变长或变短底层文件存储原理

    为了搞清楚MySQL对于可变长度字段值修改时,如何高效操作数据文件的机制.之前一直模糊不清,网上也搜不到现成的答案.经过多方资料搜集整理.写出此文供大家一起参阅.由于涉及众多非常底层的知识,我假设读者 ...

  3. Ubuntu终端里面显示路径名称太长,怎么设置变短【转】

    转自:http://blog.csdn.net/id19870510/article/details/8276914 $: sudo vi ~/.bashrc 这个文件记录了用户终端配置 找到 if ...

  4. ie7 动态改变select option时,宽度自动变短解决方法

    <html> <head> <title>JQuery</title> <meta http-equiv="pragma" c ...

  5. SP338ROADS题解--最短路变式

    题目链接 https://www.luogu.org/problemnew/show/SP338 分析 联想到不久前做过的一道题\(Full\) \(Tank\),感觉可以用优先队列做,于是写了\(d ...

  6. 洛谷4366——最短路(dijkstra,思维,异或)

    题目大意 给定一个n个点,m条边的图,每条边有边权,而每个点\(i\)也可以直接到达\(j\),代价是\(i\ xor\ j\),给定一个S和T,求S到T的最小代价 其中\(n\le100000,m\ ...

  7. floyd最短路

    floyd可以在O(n^3)的时间复杂度,O(n^2)的空间复杂度下求解正权图中任意两点间的最短路长度. 本质是动态规划. 定义f[k][i][j]表示从i出发,途中只允许经过编号小于等于k的点时的最 ...

  8. 「bzoj1003」「ZJOI2006」物流运输 最短路+区间dp

    「bzoj1003」「ZJOI2006」物流运输---------------------------------------------------------------------------- ...

  9. [最短路,floyd] Codeforces 1204C Anna, Svyatoslav and Maps

    题目:http://codeforces.com/contest/1204/problem/C C. Anna, Svyatoslav and Maps time limit per test 2 s ...

随机推荐

  1. [暴力枚举]Codeforces Vanya and Label

    Vanya and Label time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  2. 洛谷5026 Lycanthropy 差分套差分

    题目链接 https://www.luogu.com.cn/problem/P5026 题意 在一个长度为m的序列中,每次给一个下标x,和一个权值v,然后从x-v*3到x-v*2单调递增,从x-v*2 ...

  3. Apple的Core ML3简介——为iPhone构建深度学习模型(附代码)

    概述 Apple的Core ML 3是一个为开发人员和程序员设计的工具,帮助程序员进入人工智能生态 你可以使用Core ML 3为iPhone构建机器学习和深度学习模型 在本文中,我们将为iPhone ...

  4. Typora+markdown 最常用语法教程

    Typora+markdown 最常用语法教程(by 程序员宝藏) Typora+markdown 最常用语法教程(by 程序员宝藏) 请先配置推荐配置(文件->偏好设置): 文章目录 Typo ...

  5. coding++:MD5加密(JAVA加密 与 JS加密不一致问题)

    要求:根据指定 字符加密   JS中的加密方法 要和 JAVA中的算法保持一致,解决如下: var rotateLeft = function (lValue, iShiftBits) { retur ...

  6. qq,新浪分享

    var _title,_source,_sourceUrl,_pic,_showcount,_desc,_summary,_site; // 新浪微博分享$('.xlwb-share').on('cl ...

  7. .NET Core技术研究-中间件的由来和使用

    我们将原有ASP.NET应用升级到ASP.NET Core的过程中,会遇到一个新的概念:中间件. 中间件是ASP.NET Core全新引入的概念.中间件是一种装配到应用管道中以处理请求和响应的软件.  ...

  8. Unity 阴影淡入淡出效果中Shader常量 unity_ShadowFadeCenterAndType和_LightShadowData的问题

    由于Universal Render Pipeline目前(2020年4月1日)把阴影淡入淡出这个功能竟然给取消了…我自己拿片元位置到相机位置的距离进行了一个淡化,但是阴影边缘老是被裁切…后来研究了一 ...

  9. springboot集成通用mapper详细配置

    通常,我们利用mybatis写持久层方法.要么按照传统定义mapper方法,定义xml文件的方式,全部手写.要么需要通过mybatis-generator逆向工程插件生成大量的xxxExample文件 ...

  10. ovirt 重新安装主机失败

    重新安装主机引擎事件报错 Host engine installation failed. Failed to execute Ansible host-deploy role. Please che ...