题目描述 Description###

有一天,\(FJ\) 买了一辆车,但是,他一手下载了两个\(GPS\) 系统。好了现在麻烦的事情来了,\(GPS\) 有一个功能大概大家也知道,如果\(FJ\) 没有按照\(GPS\) 内置地图的最短路走,\(GPS\) 就会报错来骚扰你。现在\(FJ\) 准备从他的农舍(在1这个点)开车到他的谷屋(\(n\) 这个点)。\(FJ\) 给了你两个\(GPS\) 系统内置地图的信息,他想知道,他最少会听到多少次报错(如果\(FJ\) 走的路同时不满足两个\(GPS\) ,报错次数+2)

输入描述 Input Description###

第一行:\(n\) ,\(k\) ;\(n\) 表示有\(FJ\) 的谷屋在哪,同时保证\(GPS\) 内置地图里的点没有超过\(n\) 的点。\(K\) 表示\(GPS\) 内置地图里的路有多少条,如果两个点没有连接则表明这不是一条通路。

接下来\(k\) 行,每行4个数\(X\) ,\(Y\) ,\(A\) ,\(B\) 分别表示从\(X\) 到\(Y\) 在第一个\(GPS\) 地图里的距离是\(A\) ,在第二个\(GPS\) 地图里的是\(B\) 。注意由于地形的其他因素\(GPS\) 给出的边是有向边。

输出描述 Output Description###

一个值,表示\(FJ\) 最少听到的报错次数。

样例输入 Sample Input###

  1. 5 7
  2. 3 4 7 1
  3. 1 3 2 20
  4. 1 4 17 18
  5. 4 5 25 3
  6. 1 2 10 1
  7. 3 5 4 14
  8. 2 4 6 5

样例输出 Sample Output###

  1. 1

数据范围及提示 Data Size & Hint###

\(FJ\) 选择的路线是1 2 4 5,但是\(GPS\) 1认为的最短路是1到3,所以报错一次,对于剩下的2 4 5,两个\(GPS\) 都不会报错。

\(N<=10000\) ,至于路有多少条自己算吧。数据保证所有的距离都在$2^{31}-1 $ 以内。

之前的一些废话###

离期中还有两周,离NOIP还有不到三周,下午开始停课计划,是时候拼了!

题解###

对于第一个\(GPS\) 求一遍最短路,对第二个也求一遍最短路,注意是以\(n\) 为源点进行最短路,所以还要存一个反图。然后我们尝试建一个报错的地图。在原图上搜索,对于一条边,如果走这一条边不满足第一个\(GPS\) 上的最短路这条路边权加一,同理判断是否第二个的\(GPS\) ,建好图之后再跑一个最短路即可。

代码###

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cmath>
  4. #include<cstdio>
  5. #include<queue>
  6. #include<cstring>
  7. using namespace std;
  8. typedef long long LL;
  9. typedef pair<int,int> PII;
  10. #define mem(a,b) memset(a,b,sizeof(a))
  11. inline int read()
  12. {
  13. int x=0,f=1;char c=getchar();
  14. while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
  15. while(isdigit(c)){x=x*10+c-'0';c=getchar();}
  16. return x*f;
  17. }
  18. const int maxn=10010,maxm=50010;
  19. struct Edge
  20. {
  21. int u,v,w1,w2,next;
  22. Edge() {}
  23. Edge(int _1,int _2,int _3,int _4,int _5):u(_1),v(_2),w1(_3),w2(_4),next(_5) {}
  24. }e[maxm<<1],rev[maxm<<1],E[maxm<<1];
  25. int n,m,first[maxn],rfirst[maxn],First[maxn],c1=-1,c2=-1,ce=-1,a,b,c,d,dis1[maxn],dis2[maxn],dis3[maxn];
  26. bool vis[maxn];
  27. queue<int> Q;
  28. void addEdge(int a,int b,int c,int d)
  29. {
  30. e[++c1]=Edge(a,b,c,d,first[a]);first[a]=c1;
  31. rev[++c2]=Edge(b,a,c,d,rfirst[b]);rfirst[b]=c2;
  32. }
  33. void AddEdge(int a,int b,int c){E[++ce]=Edge(a,b,c,0,First[a]);First[a]=ce;}
  34. void SPFA1()
  35. {
  36. mem(vis,0);mem(dis1,42);
  37. while(Q.size())Q.pop();
  38. Q.push(n);vis[n]=1;dis1[n]=0;
  39. while(Q.size())
  40. {
  41. int now=Q.front();Q.pop();
  42. for(int i=rfirst[now];i!=-1;i=rev[i].next)
  43. if(dis1[now]+rev[i].w1<dis1[rev[i].v])
  44. {
  45. dis1[rev[i].v]=dis1[now]+rev[i].w1;
  46. if(!vis[rev[i].v])
  47. {
  48. Q.push(rev[i].v);
  49. vis[rev[i].v]=1;
  50. }
  51. }
  52. vis[now]=0;
  53. }
  54. return;
  55. }
  56. void SPFA2()
  57. {
  58. mem(vis,0);mem(dis2,42);
  59. while(Q.size())Q.pop();
  60. Q.push(n);vis[n]=1;dis2[n]=0;
  61. while(Q.size())
  62. {
  63. int now=Q.front();Q.pop();
  64. for(int i=rfirst[now];i!=-1;i=rev[i].next)
  65. if(dis2[now]+rev[i].w2<dis2[rev[i].v])
  66. {
  67. dis2[rev[i].v]=dis2[now]+rev[i].w2;
  68. if(!vis[rev[i].v])
  69. {
  70. Q.push(rev[i].v);
  71. vis[rev[i].v]=1;
  72. }
  73. }
  74. vis[now]=0;
  75. }
  76. return;
  77. }
  78. void SPFA3()
  79. {
  80. mem(vis,0);mem(dis3,42);
  81. while(Q.size())Q.pop();
  82. Q.push(1);vis[1]=1;dis3[1]=0;
  83. while(Q.size())
  84. {
  85. int now=Q.front();Q.pop();
  86. for(int i=First[now];i!=-1;i=E[i].next)
  87. if(dis3[now]+E[i].w1<dis3[E[i].v])
  88. {
  89. dis3[E[i].v]=dis3[now]+E[i].w1;
  90. if(!vis[E[i].v])
  91. {
  92. Q.push(E[i].v);
  93. vis[E[i].v]=1;
  94. }
  95. }
  96. vis[now]=0;
  97. }
  98. return;
  99. }
  100. int main()
  101. {
  102. mem(first,-1);mem(rfirst,-1);mem(First,-1);
  103. n=read();m=read();
  104. for(int i=1;i<=m;i++)a=read(),b=read(),c=read(),d=read(),addEdge(a,b,c,d);
  105. SPFA1();SPFA2();
  106. for(int point=1;point<=n;point++)
  107. for(int i=first[point];i!=-1;i=e[i].next)
  108. {
  109. int cnt=0;
  110. if(dis1[point]!=dis1[e[i].v]+e[i].w1)cnt++;
  111. if(dis2[point]!=dis2[e[i].v]+e[i].w2)cnt++;
  112. AddEdge(point,e[i].v,cnt);
  113. }
  114. SPFA3();
  115. printf("%d\n",dis3[n]);
  116. return 0;
  117. }

总结###

还是比较套路的。

[BZOJ3538]坑爹的GPS的更多相关文章

  1. 9.26 noip模拟试题

    魔术球问题弱化版(ball.c/.cpp/.pas) 题目描述 假设有 n 根柱子,现要按下述规则在这 n 根柱子中依次放入编号为 1,2,3,…的球. (1)每次只能在某根柱子的最上面放球. (2) ...

  2. 2014-6-28 NOIP模拟赛

    [今天我出的三道题目全部是图论哦,请大家轻虐] 1.魔术球问题弱化版(ball.c/.cpp/.pas) 题目描述 假设有 n 根柱子,现要按下述规则在这 n 根柱子中依次放入编号为 1,2,3,…的 ...

  3. NOIP模拟 7.04

    魔术球问题弱化版(ball.c/.cpp/.pas) [题目描述] 假设有 n 根柱子,现要按下述规则在这 n 根柱子中依次放入编号为 1,2,3,…的球. (1)每次只能在某根柱子的最上面放球. ( ...

  4. 坑爹的 SONY AS100V GPS

    事情是这样的,为了记录自己的生活,也是出于对视频编辑的兴趣,买了一台 SONY 的 AS100V 运动摄像机. 公司到货,回家路上拍了一段,回家兴冲冲的连上电脑,想看看 GPS 数据,发现是 SONY ...

  5. BZOJ3538: [Usaco2014 Open]Dueling GPS

    3538: [Usaco2014 Open]Dueling GPS Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 59  Solved: 36[Subm ...

  6. Android GPS应用开发

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5715879.html GPS定位系统由三部分组成,即由GPS卫星组成的空间部分,若干地面组成的控制部分和普通 ...

  7. android GPS定位源码 地图显示位置源码 有用到的小伙伴自提取

    package com.jasgroup.cn.amhdeam; import java.io.IOException; import java.util.Iterator; import andro ...

  8. MTK MT33xx型GPS的NMEA协议解析实例

    1)解析实现 gps_main.c #include <nmea/nmea.h> #include <string.h> #include <stdio.h> #i ...

  9. Qt - 读取GPS数据

    1.GPS型号为ublox(EVK-M8L),配有USB接口,Qt版本5.7 2.实现步骤: (1)实现串口通信 采用Qt5.7 内置的串口操作类QSerialPort和QSerialPortInfo ...

随机推荐

  1. Azure Automation (7) 执行Azure SQL Job

    <Windows Azure Platform 系列文章目录> 之前Automation介绍的内容,是在ASM模式下自动化开关机. 本章将介绍如何在Automation中,设置开关机脚本, ...

  2. 卡尔曼滤波C++代码

    #include <ros/ros.h> #include <string> #include <stdlib.h> #include <iostream&g ...

  3. flink solt,并行度

    转自:https://www.jianshu.com/p/3598f23031e6 简介 Flink运行时主要角色有两个:JobManager和TaskManager,无论是standalone集群, ...

  4. 《Spring + MyBatis 企业应用实战》书评

    最近公司的前端用 MpVUE.JS 开发微信小程序遇到一个问题,对后端传来的富文本编辑器的标签无法进行解析.因为公司小,这个问题前端人员直接反映给老板,跟老板说,“ MpVUE.JS 无法解析富文本编 ...

  5. 把ping的结果写入文件

    写一个sh文件: #!/bin/bash while true do $|>&` done 保存成ping.sh,赋可执行权限: chmod +x ping.sh 执行: sh ./pi ...

  6. 为什么Linux 普通用户在虚拟机界面可以reboot 用ssh 不能reboot

    应该是有 类似的权限控制. 如果是 localhost , 那么普通用户允许重启. 如果不是localhost,  比如ssh远程的,必须验证root权限.

  7. 【前端知识体系-JS相关】ES6专题系列总结

    1.如何搭建ES6的webpack开发环境? 安装Node环境 node -v // 10.14.1 安装NPM环境 npm -v // 6.4.1 安装babel npm install @babe ...

  8. CodeForces 463D DP

    Gargari got bored to play with the bishops and now, after solving the problem about them, he is tryi ...

  9. 奥展项目笔记04--Spring cloud 通过父工程打包多个子工程,导出可运行的Jar包

    在spring cloud微服务搭建过程中,我们创建了多个微服务模块,如图: 1.父工程Pom文件 <?xml version="1.0" encoding="UT ...

  10. 使用 Floccus 插件和坚果云同步 Chrome 类浏览器书签

    使用 Floccus 插件和坚果云同步 Chrome 类浏览器书签 魏刘宏  2019 年 11 月 22 日 如题,本文讨论在使用 Chromium 内核的浏览器上,使用 Floccus 插件,配合 ...