题解:设有一条边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 ;
}

最新文章

  1. Create views of OpenCASCADE objects in the Debugger
  2. 【WEB前端】CSS继承性和层叠性(极度重要)
  3. C# 模拟按下回车键自动登录
  4. 在ubuntu上搭建开发环境1---在windows7的基础上在安装ubuntu(双系统)
  5. [算法导论]哈希表 @ Python
  6. iOS证书失效
  7. innobackupex err2
  8. careercup-高等难度 18.1
  9. Unity3D 集合插件目录
  10. sharepoint 2010 masterpage中必须的Content PlaceHolder
  11. [Mime] MimeEntity--MimeEntity Mime实体帮助类 (转载)
  12. HDU1300DP
  13. 读取数据表中第m条到第n条的数据,SQL语句怎么写?
  14. 解决openstack实例主机名后缀问题
  15. 编写具有临时root权限的应用
  16. JavaScript深度克隆
  17. pssh,pdsh,mussh,cssh,dsh运维工具介绍
  18. ng2-file-upload 使用记录
  19. C博客作业03—函数
  20. Django准备知识-web应用、http协议、web框架、Django简介

热门文章

  1. Building Applications with Force.com and VisualForce(Dev401)(十四):Implementing Business Processes:Auditing Processes
  2. PyTorch专栏(五):迁移学习
  3. TensorFlow系列专题(七):一文综述RNN循环神经网络
  4. coding++:java-HashMap的负载因子为什么默认是0.75?
  5. 医学图像dcm2d切片文件转3dnii文件
  6. Spring Boot整合Servlet,Filter,Listener,访问静态资源
  7. B. Lost Number【CF交互题 暴力】
  8. Vertica的这些事(十二)——-vertica备份与恢复
  9. 除了chrome、Firefox之外其他浏览器全都连不上网
  10. Window.requestAnimationFrame()动画更新