[USACO14OPEN]GPS的决斗Dueling GPS's
题目概况
题目描述
给你一个\(N\)个点的有向图,可能有重边.
有两个\(GPS\)定位系统,分别认为经过边\(i\)的时间为\(P_i\),和\(Q_i\).
每走一条边的时候,如果一个系统认为走的这条边不是它认为的最短路,就会受到警告一次.
两个系统是分开警告的,就是说当走的这条边都不在两个系统认为的最短路范围内,就会受到2次警告.
如果边\((u,v)\)不在\(u\)到\(n\)的最短路径上,这条边就受到一次警告,求从\(1\)到\(n\)最少受到多少次警告。
输入格式
第一行,两个整数,\(n,m\),表示\(n\)个点,\(m\)条边.
接下来有\(m\)行,每一行四个整数,\(a_i,b_i,c_i,d_i\).
表示有一条有向边\((a_i,b_i)\),然后第一个导航认为消耗时间为\(c_i\),第二导航认为消耗时间为\(d_i\)
输出格式
一行整数,输出最少警告数
数据范围
\]
算法解析
题意理解
两个\(GPS\),系统为你分别规划了一条最短路径.
一旦你不走其中一个\(GPS\)认为的最短路径上的边,就会警告你一次.
因此有可能两个\(GPS\)都警告你.
算法解析
首先,我们要找到两条最短路径.
因此我们需要知道任意节点到\(n\)号节点的最短路.
所以我们可以建反向图,从\(n\)号节点出发,分别按照两个GPS跑一次最短路,求出路径.
其次就是统计每条边上警告数量。
我们可以考虑枚举每一条边.
然后针对两个不同的GPS系统
判断其权值是否是这条边两个节点的最短路长度。
如果是表示位于最短路,否则不位于最短路.
最后,统计最少警告数量
根据上面的每条边的警告数量,再来一次最短路.
然后这道题目就解决完了,但是代码是真的一言难尽.
代码解析
#include<bits/stdc++.h>
using namespace std;
const int N=11000;
struct node
{
int v,w;
};
vector<node> f[N],g[N],ans[N];
int dis1[N],dis2[N],dis3[N],n,m,vis[N];
void spfa(vector<node> g[N],int d[],int x)//传入存储图的数组,最短路数组,起始点
{
for(int i=1; i<=n; i++)//记住这里一定不能使用memset,因为会失灵
d[i]=0x3f3f3f3f;
memset(vis,0,sizeof(vis));//这里可以memset,是因为是全局变量
d[x]=0;
queue<int> q;
q.push(x);
while (q.size())
{
int x=q.front();
q.pop();
vis[x]=0;
for (int i=0; i<g[x].size(); i++)//访问所有的出边
{
int y=g[x][i].v,w=g[x][i].w;
if (d[y]>d[x]+w)//三角形不等式,然后开始松弛
{
d[y]=d[x]+w;
if (!vis[y])
{
q.push(y);
vis[y]=1;
}
}
}
}
}
inline void init()
{
scanf("%d%d",&n,&m);
for(int i=1; i<=m; i++)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
f[b].push_back({a,c});//这里是反向图建立,第一个导航
g[b].push_back({a,d});//记得将方向取反,第二个导航
}
spfa(f,dis1,n);//分别找到GPS距离
spfa(g,dis2,n);
for (int i=1; i<=n; i++)//对于每一个点
for (int j=0; j<f[i].size(); j++)//这个是针对每一条出边,f,g无所谓
{
int u=f[i][j].v,p=f[i][j].w,q=g[i][j].w,r=2;//u是抵达点,p是第一个导航的抵达点,q是第二个导航的抵达点
if (dis1[u]-dis1[i]==p) r--;//发现是在第一个导航最短路上,然后警告数-1
if (dis2[u]-dis2[i]==q) r--;//发现是在第二个导航最短路上,然后警告数-1
ans[u].push_back({i,r});//存储边和权值
}
spfa(ans,dis3,1);
printf("%d\n",dis3[n]);
}
int main()
{
init();
return 0;
}
[USACO14OPEN]GPS的决斗Dueling GPS's的更多相关文章
- BZOJ 3538 == 洛谷 P3106 [USACO14OPEN]GPS的决斗Dueling GPS's
P3106 [USACO14OPEN]GPS的决斗Dueling GPS's 题目描述 Farmer John has recently purchased a new car online, but ...
- Luogu P3106 [USACO14OPEN]GPS的决斗Dueling GPS's(最短路)
P3106 [USACO14OPEN]GPS的决斗Dueling GPS's 题意 题目描述 Farmer John has recently purchased a new car online, ...
- 洛谷 3106 [USACO14OPEN]GPS的决斗Dueling GPS's 3720 [AHOI2017初中组]guide
[题解] 这两道题是完全一样的. 思路其实很简单,对于两种边权分别建反向图跑dijkstra. 如果某条边在某一种边权的图中不是最短路上的边,就把它的cnt加上1.(这样每条边的cnt是0或1或2,代 ...
- 2018.07.22 洛谷P3106 GPS的决斗Dueling GPS's(最短路)
传送门 图论模拟题. 这题直接写3个(可以压成一个)spfa" role="presentation" style="position: relative;&q ...
- USACO Dueling GPS's
洛谷 P3106 [USACO14OPEN]GPS的决斗Dueling GPS's 洛谷传送门 JDOJ 2424: USACO 2014 Open Silver 2.Dueling GPSs JDO ...
- BZOJ3538: [Usaco2014 Open]Dueling GPS
3538: [Usaco2014 Open]Dueling GPS Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 59 Solved: 36[Subm ...
- GPS校时器,GPS时钟装置,NTP网络时间服务器
GPS校时器,GPS时钟装置,NTP网络时间服务器 GPS校时器,GPS时钟装置,NTP网络时间服务器 GPS校时器,GPS时钟装置,NTP网络时间服务器 GPS校时器,GPS时钟装置,NTP网络时间 ...
- 部署-GPS授时系统:GPS授时系统
ylbtech-部署-GPS授时系统:GPS授时系统 GPS授时系统是针对自动化系统中的计算机.控制装置等进行校时的高科技产品,GPS授时产品它从GPS卫星上获取标准的时间信号,将这些信息通过各种接口 ...
- [USACO14OPEN] Dueling GPS's[最短路建模]
题目描述 Farmer John has recently purchased a new car online, but in his haste he accidentally clicked t ...
随机推荐
- for 和 while 用于遍历时候的区别
for: 以空格作为间隔符,输出字段. read: 以行作为间隔符,输出字段. 对于文件来说,如果只有一列,for 和 read 无区别, 多列的话, 有区别. read 用法详情: 见 如下转 ...
- 用elasticsearchdump备份恢复数据
1.安装elastic searchdump mkdir /data/nodejs cd /data/nodejs wget https://nodejs.org/dist/v10.16.2/node ...
- 连接池和JDBCTemplate
一:什么是连接池?使用连接池的好处是什么? 连接池就是一个存放数据库连接对象的容器.当系统初始化后,就会向数据库申请一些连接对象存放到容器里,用的时候直接从容器里取,用完后放回连接池. 连接池可以提高 ...
- 大周末的不休息,继续学习pandas吧,pandas你该这么学,No.7
其实,写文章真的挺难的 每天抽点时间,写写文采飘逸的文章 坚持个几年,成为称霸一方的大佬 坚持就会成功吧~ 最近碰到瓶颈了, 一直找不到好的运营公众号的方式(好想有人指导唉~,对了,橡皮擦有个100多 ...
- zTree入门使用
简单入门使用,熟悉其功能,没有与异步调用后台数据,用的是本地设置的数据. zTree的API:http://www.treejs.cn/v3/api.php 源码:https://github.com ...
- Linux 工作管理 (job control)
fg , bg 有时,命令需要很长的时间才能执行完成.对于这种情况,我们使用‘bg’命令可以将任务放在后台执行,而用‘fg’可以调到前台来使用. 我们可以通过‘&’在后台启动一个程序: fin ...
- Vue代码分割懒加载的实现方法
什么是懒加载 懒加载也叫延迟加载,即在需要的时候进行加载,随用随载. 为什么需要懒加载 在单页应用中,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多 ...
- *#【Python】【基础知识】【运算符】【Python的几类运算符】
Python的运算符分为以下几类: 算术运算符比较(关系)运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符 以及需要考虑的:运算符优先级 一.算术运算符: 需要注意的,上图是Python 2.0 ...
- Facebook推荐算法模型DLRM解读
参考:https://mp.weixin.qq.com/s/mUNjLuOG2UvztCEP3wyPPw 代码:https://github.com/facebookresearch/dlrm
- SQL中的关键词
AS的用法及妙用 https://www.cnblogs.com/zhaotiancheng/p/6692553.html