最短路变短了 (思维+反向djstrea)
题解:设有一条边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)的更多相关文章
- luogu 4366 [Code+#4]最短路 Dijkstra + 位运算 + 思维
这个题思路十分巧妙,感觉很多题都有类似的套路. 我们发现异或操作其实就是将一个数的二进制的若干个 $0$ 变成 $1$,或者一些 $1$ 变成 $0$. 而每次按照某种顺序一位一位地异或也可以起到同时 ...
- mysql变成类型字段varchar值更新变长或变短底层文件存储原理
为了搞清楚MySQL对于可变长度字段值修改时,如何高效操作数据文件的机制.之前一直模糊不清,网上也搜不到现成的答案.经过多方资料搜集整理.写出此文供大家一起参阅.由于涉及众多非常底层的知识,我假设读者 ...
- Ubuntu终端里面显示路径名称太长,怎么设置变短【转】
转自:http://blog.csdn.net/id19870510/article/details/8276914 $: sudo vi ~/.bashrc 这个文件记录了用户终端配置 找到 if ...
- ie7 动态改变select option时,宽度自动变短解决方法
<html> <head> <title>JQuery</title> <meta http-equiv="pragma" c ...
- SP338ROADS题解--最短路变式
题目链接 https://www.luogu.org/problemnew/show/SP338 分析 联想到不久前做过的一道题\(Full\) \(Tank\),感觉可以用优先队列做,于是写了\(d ...
- 洛谷4366——最短路(dijkstra,思维,异或)
题目大意 给定一个n个点,m条边的图,每条边有边权,而每个点\(i\)也可以直接到达\(j\),代价是\(i\ xor\ j\),给定一个S和T,求S到T的最小代价 其中\(n\le100000,m\ ...
- floyd最短路
floyd可以在O(n^3)的时间复杂度,O(n^2)的空间复杂度下求解正权图中任意两点间的最短路长度. 本质是动态规划. 定义f[k][i][j]表示从i出发,途中只允许经过编号小于等于k的点时的最 ...
- 「bzoj1003」「ZJOI2006」物流运输 最短路+区间dp
「bzoj1003」「ZJOI2006」物流运输---------------------------------------------------------------------------- ...
- [最短路,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 ...
随机推荐
- [暴力枚举]Codeforces Vanya and Label
Vanya and Label time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- 洛谷5026 Lycanthropy 差分套差分
题目链接 https://www.luogu.com.cn/problem/P5026 题意 在一个长度为m的序列中,每次给一个下标x,和一个权值v,然后从x-v*3到x-v*2单调递增,从x-v*2 ...
- Apple的Core ML3简介——为iPhone构建深度学习模型(附代码)
概述 Apple的Core ML 3是一个为开发人员和程序员设计的工具,帮助程序员进入人工智能生态 你可以使用Core ML 3为iPhone构建机器学习和深度学习模型 在本文中,我们将为iPhone ...
- Typora+markdown 最常用语法教程
Typora+markdown 最常用语法教程(by 程序员宝藏) Typora+markdown 最常用语法教程(by 程序员宝藏) 请先配置推荐配置(文件->偏好设置): 文章目录 Typo ...
- coding++:MD5加密(JAVA加密 与 JS加密不一致问题)
要求:根据指定 字符加密 JS中的加密方法 要和 JAVA中的算法保持一致,解决如下: var rotateLeft = function (lValue, iShiftBits) { retur ...
- qq,新浪分享
var _title,_source,_sourceUrl,_pic,_showcount,_desc,_summary,_site; // 新浪微博分享$('.xlwb-share').on('cl ...
- .NET Core技术研究-中间件的由来和使用
我们将原有ASP.NET应用升级到ASP.NET Core的过程中,会遇到一个新的概念:中间件. 中间件是ASP.NET Core全新引入的概念.中间件是一种装配到应用管道中以处理请求和响应的软件. ...
- Unity 阴影淡入淡出效果中Shader常量 unity_ShadowFadeCenterAndType和_LightShadowData的问题
由于Universal Render Pipeline目前(2020年4月1日)把阴影淡入淡出这个功能竟然给取消了…我自己拿片元位置到相机位置的距离进行了一个淡化,但是阴影边缘老是被裁切…后来研究了一 ...
- springboot集成通用mapper详细配置
通常,我们利用mybatis写持久层方法.要么按照传统定义mapper方法,定义xml文件的方式,全部手写.要么需要通过mybatis-generator逆向工程插件生成大量的xxxExample文件 ...
- ovirt 重新安装主机失败
重新安装主机引擎事件报错 Host engine installation failed. Failed to execute Ansible host-deploy role. Please che ...