【链接】 我是链接,点我呀:)

【题意】

在这里输入题意

【题解】

处理出起点到任意点的最短路以及最短路条数=>dis[0][i],cnt[0][i]
然后
把所有的边反向
处理出在反图上终点到任意点的最短路以及最短路条数=>dis[1][i],cnt[1][i]
dis数组的初值为-1,表示无穷大
设起点到终点的最短路为mini
起点到终点的最短路条数为minicnt
对于每一条边(x,y,z)
如果dis[0][x]==-1 || dis[1][y]==-1代表x或者y不能到达起点或终点
则直接输出NO
否则
如果dis[0][x]+dis[1][y]==mini 且 cnt[0][x]*cnt[1][y]==minicnt的话
输出YES.这条边肯定在最短路上
(这种情况是把重边也考虑进去了的,因为如果有重边那么minicnt肯定不等于cnt[0][x]*cnt[1][y],肯定还要乘上重边的个数的
否则
让z减小到满足dis[0][x]+dis[1][y]+z求最短路条数要用dijkstra算法

用spfa会错

这道题某个点卡1e9+7模数

改成987654321就对了

【代码】

  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int N = 1e5;
  5. const ll MOD = 987654321;
  6. int n,m,s,t;
  7. ll cnt[2][N+10];
  8. ll dis[2][N+10];
  9. vector<pair<int,int> > g[2][N+10];
  10. pair<int,pair<int,int> > bian[N+10];
  11. queue<int> dl;
  12. map<pair<int,pair<int,int> >,int>dic;
  13. void get_dis(int s,int k){
  14. for (int i = 1;i <= n;i++) dis[k][i] = -1;
  15. cnt[k][s] = 1;
  16. dis[k][s] = 0;
  17. priority_queue<pair<ll,int> ,vector<pair<ll,int> >,greater<pair<ll,int> > > pq;
  18. pq.push(make_pair(0,s));
  19. while (!pq.empty()){
  20. auto temp1 = pq.top();
  21. pq.pop();
  22. int x = temp1.second;ll dis0 = temp1.first;
  23. if (dis[k][x]!=dis0) continue;
  24. for (auto temp:g[k][x]){
  25. int y = temp.first;ll z = temp.second;
  26. if (dis[k][y]==-1 || dis[k][y]>dis0+z){
  27. dis[k][y] = dis0 + z;
  28. cnt[k][y] = cnt[k][x];
  29. pq.push({dis[k][y],y});
  30. }else if (dis[k][y]==dis0+z) cnt[k][y]=(cnt[k][y]+cnt[k][x])%MOD;
  31. }
  32. }
  33. }
  34. int main()
  35. {
  36. #ifdef LOCAL_DEFINE
  37. freopen("rush.txt","r",stdin);
  38. #endif // LOCAL_DEFINE
  39. ios::sync_with_stdio(0),cin.tie(0);
  40. cin >> n >> m >>s>>t;
  41. for (int i = 1;i <= m;i++){
  42. int x,y,z;
  43. cin >> x >> y >>z;
  44. dic[{x,{y,z}}]++;
  45. bian[i] = {x,{y,z}};
  46. g[0][x].push_back({y,z});
  47. g[1][y].push_back({x,z});
  48. }
  49. get_dis(s,0);
  50. get_dis(t,1);
  51. for (int i = 1;i <= m;i++){
  52. int x,y;
  53. x = bian[i].first;y = bian[i].second.first;
  54. if (dis[0][x]<0 || dis[1][y]<0) {
  55. cout<<"NO"<<endl;
  56. continue;
  57. }
  58. ll z = bian[i].second.second;
  59. if (dis[0][x]+dis[1][y]+z==dis[0][t] && (cnt[0][x]*cnt[1][y]%MOD)==cnt[0][t]){
  60. cout<<"YES"<<endl;
  61. }else{
  62. ll need = dis[0][x]+dis[1][y]+z-dis[0][t]+1;
  63. if ((z-need)>=1){
  64. cout<<"CAN "<<need<<endl;
  65. }else{
  66. cout<<"NO"<<endl;
  67. }
  68. }
  69. }
  70. return 0;
  71. }

【Henu ACM Round#14 F】 President and Roads的更多相关文章

  1. 【Henu ACM Round#16 F】Om Nom and Necklace

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] KMP算法可以把"i前缀"pre[i] 分成ssssst的形式 这里t是s的前缀. 然后s其实就是pre[i]中 ...

  2. 【Henu ACM Round#17 F】Upgrading Array

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果我们对某一个位置i操作两次的话. 显然结果就和操作一次一样. 因为第一次操作过后1..i这些数字就变成是互质的了. gcd为1. ...

  3. 【Henu ACM Round#14 D】Kefa and Dishes

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 状态压缩动规. 可以写成记忆化搜索的形式. f[bit][p] 表示选取的菜的情况为bit(用0..2^(N)-1的二进制形式表示各 ...

  4. 【Henu ACM Round #13 F】Fibonacci-ish

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举序列的头两个数字是什么 O(N^2) 然后头两个数字确定之后. f[3],f[4]..就确定了 只需查看f[3],f[4]..是 ...

  5. 【Henu ACM Round#15 F】Arthur and Questions

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] a1+a2+...+ak<a2+a3+...ak+1 ->a1<ak+1 a2+a3+...+ak+1<a3 ...

  6. 【Henu ACM Round#18 F】Arthur and Walls

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑,为什么一个连通块里面的空格没有变成一个矩形? 如果不是形成矩形的话. 肯定是因为某个2x2的单张方形里面. 只有一个角是墙.其 ...

  7. 【Henu ACM Round#20 F】 Arthur and Brackets

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 所给的li,ri是左括号从左到右的顺序给的. (且注意长度是2*n 现在我们先把第一个左括号放在第1个位置. 然后考虑第二个位置. ...

  8. 【Henu ACM Round#19 F】Dispute

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 这一题和这一题很像 (链接 ) 会发现如果a[i]!=b[i]那么就按下i就好了. 然后改变和他相邻的点. 此后a[i]再也不可能和 ...

  9. 【Henu ACM Round#14 E】Kefa and Watch

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 在做之前需要了解一个知识点. 就是如果一个字符串s是一个a循环串. (字符串的长度设为n,下标从1开始 那么s[1..n-a]和s[ ...

随机推荐

  1. 获取当前最上层controller

    - (UIViewController *)topViewController { UIViewController *resultVC; resultVC = [self _topViewContr ...

  2. c#中debug和release版本的区别

    1 debug版本称为调试版本,包含各种调试信息,以为开发人员提供强大的应用程序调试能力,其没有做任何优化,速度慢. 2 release版本称为发布版本,不保存调试信息,但是做了各种的优化,体积小,运 ...

  3. c# window服务-初学习

    window服务-初学习 一.工具: VS2015+NET Framework4.5. 二.操作: 1.新建windows服务的项目: 2.修改windows服务相关内容: 3.预览windows服务 ...

  4. 服务器http处理流程

    网络请求.处理的组织: context Facade模式/指令处理引擎/简单处理机: 响应码: 只要有响应码就代表服务器已经接收到请求:无响应代表网络层出现问题,与服务器无关. 处理步骤: 1)模块( ...

  5. SPOJ 7258 SUBLEX 后缀数组 + 二分答案 + 前缀和

    Code: #include <cstdio> #include <algorithm> #include <cstring> #define setIO(s) f ...

  6. 容器配置https

    生成秘钥库 通过jdk的keytool工具生成秘钥库 keytool -genkeypair -alias "localhost" -keyalg "RSA" ...

  7. 杀死超过5min闲置的终端

    #!/bin/bash #杀死超过5min闲置的终端 while [ 1 -lt 2 ] do sleep 30 for i in `w -sh | grep ":" | awk ...

  8. 对比学习sass和stylus的常用功能

    在众多的css预处理器语言中,sass和stylus算是十分优秀的两个.本文主要针对两者的常用功能做个简单的对比分析.在对比中了解二者的差异,同时帮助大家更好的掌握这两种预处理语言.本文涉及到的sas ...

  9. 题解 CF915D 【Almost Acyclic Graph】

    这道题我第一次的想法是直接判环的数量,然而事实证明实在是太naive了. 随便画个图都可以卡掉我的解法.(不知道在想什么) 这道题的正解是拓扑排序. 朴素的想法是对所有边都跑一次拓扑,但这样$O(m( ...

  10. 云服务器 ECS Linux 系统下使用 dig 命令查询域名解析

    云服务器 ECS Linux 系统可以使用通常自带的 dig 命令来查询域名解析情况.本文对此进行简要说明. 查询域名 A 记录 命令格式: dig <域名> 比如,查询域名 www.al ...