题目描述 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###

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

样例输出 Sample Output###

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\) ,建好图之后再跑一个最短路即可。

代码###

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
#define mem(a,b) memset(a,b,sizeof(a))
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxn=10010,maxm=50010;
struct Edge
{
int u,v,w1,w2,next;
Edge() {}
Edge(int _1,int _2,int _3,int _4,int _5):u(_1),v(_2),w1(_3),w2(_4),next(_5) {}
}e[maxm<<1],rev[maxm<<1],E[maxm<<1];
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];
bool vis[maxn];
queue<int> Q;
void addEdge(int a,int b,int c,int d)
{
e[++c1]=Edge(a,b,c,d,first[a]);first[a]=c1;
rev[++c2]=Edge(b,a,c,d,rfirst[b]);rfirst[b]=c2;
}
void AddEdge(int a,int b,int c){E[++ce]=Edge(a,b,c,0,First[a]);First[a]=ce;}
void SPFA1()
{
mem(vis,0);mem(dis1,42);
while(Q.size())Q.pop();
Q.push(n);vis[n]=1;dis1[n]=0;
while(Q.size())
{
int now=Q.front();Q.pop();
for(int i=rfirst[now];i!=-1;i=rev[i].next)
if(dis1[now]+rev[i].w1<dis1[rev[i].v])
{
dis1[rev[i].v]=dis1[now]+rev[i].w1;
if(!vis[rev[i].v])
{
Q.push(rev[i].v);
vis[rev[i].v]=1;
}
}
vis[now]=0;
}
return;
}
void SPFA2()
{
mem(vis,0);mem(dis2,42);
while(Q.size())Q.pop();
Q.push(n);vis[n]=1;dis2[n]=0;
while(Q.size())
{
int now=Q.front();Q.pop();
for(int i=rfirst[now];i!=-1;i=rev[i].next)
if(dis2[now]+rev[i].w2<dis2[rev[i].v])
{
dis2[rev[i].v]=dis2[now]+rev[i].w2;
if(!vis[rev[i].v])
{
Q.push(rev[i].v);
vis[rev[i].v]=1;
}
}
vis[now]=0;
}
return;
}
void SPFA3()
{
mem(vis,0);mem(dis3,42);
while(Q.size())Q.pop();
Q.push(1);vis[1]=1;dis3[1]=0;
while(Q.size())
{
int now=Q.front();Q.pop();
for(int i=First[now];i!=-1;i=E[i].next)
if(dis3[now]+E[i].w1<dis3[E[i].v])
{
dis3[E[i].v]=dis3[now]+E[i].w1;
if(!vis[E[i].v])
{
Q.push(E[i].v);
vis[E[i].v]=1;
}
}
vis[now]=0;
}
return;
}
int main()
{
mem(first,-1);mem(rfirst,-1);mem(First,-1);
n=read();m=read();
for(int i=1;i<=m;i++)a=read(),b=read(),c=read(),d=read(),addEdge(a,b,c,d);
SPFA1();SPFA2();
for(int point=1;point<=n;point++)
for(int i=first[point];i!=-1;i=e[i].next)
{
int cnt=0;
if(dis1[point]!=dis1[e[i].v]+e[i].w1)cnt++;
if(dis2[point]!=dis2[e[i].v]+e[i].w2)cnt++;
AddEdge(point,e[i].v,cnt);
}
SPFA3();
printf("%d\n",dis3[n]);
return 0;
}

总结###

还是比较套路的。

[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. 【Java语言特性学习之五】版本差异新特性

  2. Java的POJO和JavaBean的区别

    POJO Plain Ordinary Java Object,即简单的java对象. 特点 需要有一些 private 的参数,以及针对参数的 setter 和 getter 方法来访问这些参数. ...

  3. Singnal R 练习参考

    项目地址:https://gitee.com/dhclly/IceDog.SignalR/tree/master/src/chat demo的实现均来自官方的教程,教程地址: ASP.NET Core ...

  4. DVWA-CSRF学习笔记

    DVWA-CSRF学习笔记 一.CSRF(跨站请求伪造) CSRF(跨站请求伪造),是指利用受害者尚未失效的身份认证信息(cookie.session会话等),诱骗其点击恶意链接或者访问包含攻击代码的 ...

  5. Spring Boot @EnableAutoConfiguration解析

    刚做后端开发的时候,最早接触的是基础的spring,为了引用二方包提供bean,还需要在xml中增加对应的包<context:component-scan base-package=" ...

  6. Linux入门——初识Linux

    Linux入门——初识Linux 摘要:本文主要说明了Linux是什么,Linux发展历史,以及同Linux系统有关的一些基本知识. 简介 操作系统 Linux系统同Windows系统.Mac系统一样 ...

  7. IOS开发实战-Xcode创建HelloWorld项目

    一.创建工程打开Xcode开发工具,在Welcome界面选择”Create a new Xcode project”选项 在选择模板窗口,选择”Single View Application” 确定模 ...

  8. linux 环境下部署 Asp.Net Core 项目 访问 oralce 数据库

    1.ASP.NET Core 是一个跨平台的高性能开源框架,可以部署到Linux上,那项目部署在Linux上有哪些好处呢? 1.linux硬件需求小,大部分版本免费,成本低. 2.linux的用户管理 ...

  9. js javascript map函数去重功能的使用实例

    js javascript map函数去重功能的使用实例 先上一个实战例子代码 var map = new Map(); for(var i=0; i<=9; i++){ map.set(i,i ...

  10. AccessCenter 模块结构

    AccessCenter 模块结构