最短路变短了 链接

时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format:%lld

题目描述

给定一个有向带权图,其中包括 n个城市,城市编号从1 到n,有向边的编号从 1 到 m,现在有一个人位于城市
1,并且想要到城市n旅游。现在政府正在决定将一条道路反向,这个人想知道在某一指定道路反向的情况到达城市n最短路径长度会不会变短。
保证开始给定的图从城市1可以到达城市n,若边反向后城市1不能到达城市n,我们视为最短路径长度没有变短。 输入描述:
第一行包括两个整数n,m(1≤n≤100000,1≤m≤200000)(1≤n≤100000,1≤m≤200000)(1≤n≤100000,1≤m≤200000)接下来m行每行三个整数u,v,c (1≤u,v≤n,1≤c≤109)(1≤u,v≤n, 1≤c≤10^9)(1≤u,v≤n,1≤c≤109),分别代表一条有向边的起点,终点和边权。保证没有自环。接下来一行一个整数q(1≤q≤200000)(1≤q≤200000)(1≤q≤200000),代表查询组数,查询之间是独立的。接下来q行每行一个整数x(1≤x≤m)x(1≤x≤m)x(1≤x≤m),代表询问将第x条边反向后到达城市n的最短路长度会不会变短。

输出描述:
共q行,如果最短路变短输出YESYESYES,否则输出NONONO。

示例1

输入

3 4
1 2 100
2 3 100
3 1 100
2 1 1
2
1
4

输出

NO
YES

说明
第一条边反向后从点1无法到达点3,所以输出NO。第四条边反向后从点1到点3的最短路长度从200减少到101,所以输出YES。
题目描述
给定一个有向带权图,每次询问将一条边反向会不会使最短路变短。


上图为本题的思路,非常清晰简单,不懂的话就画一个图就好。
注意本题中dijkstra函数是用的指针,所以才可以实现正反向最短路只用一个函数即可,但是一旦用了指针就很容易出错,比如函数中的memset就不能写成memset(dis,32,sizeof dis);因为dis是一个指针,sizeof dis就不是数组,会出错。注意memset赋的值必须二进制下每一位相同,mmeset是以二进制下赋值的,所以memset(dis,32,n*10);赋值后:

  • 1000000是4629771061636907072
  • 32是4557430888798830399
  • 0x3f是2314885530818453536

都爆 long long 了足够大了好像就无所谓了

注意这里赋值一定要赋(n+1)*8,因为这里的dis是long long 型,占8个字节,所以要*8,如果小了就会WA!

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<math.h>
#include<vector>
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r)/2
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
//#define int __int128
using namespace std;
typedef long long ll;//全用ll可能会MLE或者直接WA,试着改成int看会不会A
const ll N=200007;
const ll INF=1e10+9;
const ll mod=2147483647;
const double EPS=1e-10;//-10次方约等于趋近为0
const double Pi=3.1415926535897;ll to[N],head[N],nex[N],Val[N],x[N],y[N],z[N],tot;
ll n,m;
ll dist[N];
ll rdist[N];inline void add(ll u,ll v,ll val)
{to[++tot]=v,Val[tot]=val;nex[tot]=head[u],head[u]=tot;
}
struct node
{ll id;ll dist;bool operator<(const node &t)const{return dist>t.dist;}
};void dijkstra(ll st,ll *dis)
{priority_queue<node> q;memset(dis,32,n*10);dis[st]=0;q.push((node){st,0});while(!q.empty()){node tmp=q.top();q.pop();ll u=tmp.id,d=tmp.dist;if(d!=dis[u])continue;for(int i=head[u];i;i=nex[i]){ll v=to[i];if(dis[v]>dis[u]+Val[i]){dis[v]=dis[u]+Val[i];q.push((node){v,dis[v]});}}}
}int main()
{scanf("%lld%lld",&n,&m);over(i,1,m){scanf("%lld%lld%lld",&x[i],&y[i],&z[i]);add(x[i],y[i],z[i]);}dijkstra(1,dist);tot=0;memset(head,0,sizeof head);over(i,1,m)add(y[i],x[i],z[i]);dijkstra(n,rdist);ll kk;scanf("%lld",&kk);while(kk--){ll i;scanf("%lld",&i);puts(dist[n] > dist[y[i]] + z[i] + rdist[x[i]] ? "YES" : "NO");}return 0;
}

注:如果您通过本文,有(qi)用(guai)的知识增加了,请您点个赞再离开,如果不嫌弃的话,点个关注再走吧,日更博主每天在线答疑 ! 当然,也非常欢迎您能在讨论区指出此文的不足处,作者会及时对文章加以修正 !如果有任何问题,欢迎评论,非常乐意为您解答!( •̀ ω •́ )✧

牛客练习赛61 D 最短路变短了(最短路,反向最短路)难度⭐⭐⭐★相关推荐

  1. 牛客练习赛 61(待补F-点分治?)

    A. 打怪 先求出每次打死一只怪需要掉多少血,然后就直接算出能够打死多少只. #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) ...

  2. 牛客练习赛61 - B - 吃水果

    题目描述 最近米咔买了n个苹果和m个香蕉,他每天可以选择吃掉一个苹果和一个香蕉(必须都吃一个,即如果其中一种水果的数量为0,则他不能进行这个操作),或者使用魔法将某一种水果的数量翻倍. 现在米咔想吃西 ...

  3. 牛客练习赛61 B 吃水果 题解

    链接:https://ac.nowcoder.com/acm/contest/5026/B 来源:牛客网 题目描述 最近米咔买了n个苹果和m个香蕉,他每天可以选择吃掉一个苹果和一个香蕉(必须都吃一个, ...

  4. 牛客练习赛61 C 四个选项(并查集、DP、排列组合)难度⭐⭐⭐

    链接:https://ac.nowcoder.com/acm/contest/5026/C 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64 ...

  5. 牛客练习赛61 E 相似的子串(二分+哈希)难度⭐⭐⭐

    相似的子串 题目链接 时间限制:C/C++ 4秒,其他语言8秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format:%lld 题目描述 给定一个字符串,要求取 ...

  6. 牛客练习赛61 C 四个选项 dp\搜索+组合数学

    https://ac.nowcoder.com/acm/contest/5026/C 思路一:dpdpdp,首先通过并查集处理出所有的连通块(限制条件),然后用dpi,x,y,z,wdp_{i,x,y ...

  7. 牛客练习赛61 B 吃水果

    题目描述 最近米咔买了n个苹果和m个香蕉,他每天可以选择吃掉一个苹果和一个香蕉(必须都吃一个,即如果其中一种水果的数量为0,则他不能进行这个操作),或者使用魔法将某一种水果的数量翻倍. 现在米咔想吃西 ...

  8. 牛客练习赛75 D 减数游戏(队列优化(需要取模的)堆)

    牛客练习赛75 D 减数游戏 思路:写一下式子可以发每次选择最小的两个数进行操作,最后得到的答案会是最大的,那我们可以将它放进一个最小堆中来维护,但是里面的数是需要取模的,当它取模的时候,将会变小.那 ...

  9. E-牛牛小数点_牛客练习赛89(数学)

    E-牛牛小数点_牛客练习赛89 (nowcoder.com) 题目描述 牛牛想和点点交朋友, 于是点点给了牛牛一个问题. 定义关于小数 xxx 的函数 f(x)f(x)f(x), 表示 xxx 中两个 ...

最新文章

  1. 【软件工程】CMMI 能力成熟度模型集成 ( CMMI 工程过程域 | CMMI 支持过程域 ) ★
  2. 团体程序设计天梯赛-练习集-L1-039. 古风排版
  3. Nginx反向代理多个应用时,通过BluePring使Flask支持二级路径(URL前缀)
  4. 疯了吧!面试官 5 连问一个 TCP 连接可以发多少个 HTTP 请求?
  5. 非常好用的两个PHP函数 serialize()和unserialize()
  6. 【中级软考】UML图(Unified Modeling Language统一建模语言、标准建模语言)
  7. Java判断一组数字是否是等差数列
  8. VTK:InfoVis之SCurveSpline
  9. 微信小程序开发系列六:微信框架API的调用
  10. [单选题]$array = array('a','b','c','d'); $array_now = array_splice($array,2); print_r($array_now);...
  11. 寻找随机的错误-一个真实的故事
  12. oracle11g高可用,oracle11g 搭建DG环境总结
  13. 面向对象 (接口 Interface)
  14. 【CodeForces - 764B 】Timofey and cubes (模拟)
  15. 计算机英语反思总结,计算机在英语教学中辅助作用的反思
  16. 最大似然估计的缺陷 —— 方差和均值的 bias
  17. word公式编辑器输入斜体
  18. oppo手机linux模式,OPPO工程模式怎么进 OPPO手机指令有哪些
  19. 遥感方向SCI期刊整理
  20. 《超新星纪元》阅读笔记

热门文章

  1. 基于OpenCV实战:对象跟踪
  2. OpenCV图像旋转的原理与技巧
  3. 【OpenCV 4开发详解】Sobel算子
  4. RabbitMQ 如何消息生产者producer发送给RabbitMQ服务器broker?
  5. 模拟PLC 的圆弧插补方式在VC中绘制圆弧
  6. python基础===两个list之间移动元素
  7. Java基础--定时任务Timer
  8. Linuxmingl
  9. 文化部随机抽查50家网络表演平台 看看有没有那种内容
  10. MySQL之alter语句用法总结