最短路变短了 (思维+反向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 ...
随机推荐
- upload-labs学习笔记
项目地址:https://github.com/c0ny1/upload-labs 运行环境 操作系统:windows.Linux php版本:推荐5.2.17(其他版本可能会导致部分Pass无法 ...
- 【codeforces】Educational Codeforces Round 80 D. Minimax Problem——二分+二进制处理
题目链接 题目大意 有n个维度为m的向量,取其中两个进行合并,合并时每个维度取两者之间的较大者,得到的新的向量中,维度值最小者最大为多少 分析 首先最需要注意的是m的取值,m最大只有8 那么我们可以二 ...
- 图论-BFS-最小高度的树 Minimum Height Trees
2018-09-24 12:01:38 问题描述: 对于一个具有树特征的无向图,我们可选择任何一个节点作为根.图因此可以成为树,在所有可能的树中,具有最小高度的树被称为最小高度树.给出这样的一个图,写 ...
- PyTorch Hub发布!一行代码调用最潮模型,图灵奖得主强推
为了调用各种经典机器学习模型,今后你不必重复造轮子了. 刚刚,Facebook宣布推出PyTorch Hub,一个包含计算机视觉.自然语言处理领域的诸多经典模型的聚合中心,让你调用起来更方便. 有多方 ...
- Centos7部署k8s[v1.16]高可用[keepalived]集群
实验目的 一般情况下,k8s集群中只有一台master和多台node,当master故障时,引发的事故后果可想而知. 故本文目的在于体现集群的高可用,即当集群中的一台master宕机后,k8s集群通过 ...
- Fiddler抓取数据包分析案例
案例:利用Fiddler抓取苏宁易购网站数据包分析 抓包软件:Fiddler4 请求名字:www.suning.com 详细内容: 一.了解数据包区域的字段含义 图1数据包区域 #:顺序号,按照抓包的 ...
- Jmeter接口测试之参数化(十)
在接口测试中,某些时候一些场景会使用到参数化的场景,参数化简单的说就是同一个请求需要不同的数据,比如在性能测试中需要并发多个用户的场景,这样的目的是为了模拟真实的用户场景,需要模拟不同的账号,这里就需 ...
- coding++ :SQLyog 最新版本12.5-64bit 破解版
点我下载 SQLyog 12.5-64bit 版本(包含注册码)
- python——体育竞技
一.体育竞技分析基本规则两个球员,交替用球拍击球发球权,回合未能进行一次击打回合结束首先达到15分赢得比赛 1.自顶向下的设计 #7_game_2.py from random import * de ...
- pre-commit + imagemin 实现图片自动压缩
我们日常开发的前端项目中,图片资源会占到项目资源的很大比例,因此在考虑到性能优化,页面加载速度的时候,如何更好地处理图片就非常重要了. 首先我们可以想到的方案是:使用webpack的image-web ...