洛谷 P1266 速度限制 最短路+SPFA算法
题面
题目链接
题目描述
在这个繁忙的社会中,我们往往不再去选择最短的道路,而是选择最快的路线。开车时每条道路的限速成为最关键的问题。不幸的是,有一些限速的标志丢失了,因此你无法得知应该开多快。一种可以辩解的解决方案是,按照原来的速度行驶。你的任务是计算两地间的最快路线。
你将获得一份现代化城市的道路交通信息。为了使问题简化,地图只包括路口和道路。每条道路是有向的,只连接了两条道路,并且最多只有一块限速标志,位于路的起点。两地A和B,最多只有一条道路从A连接到B。你可以假设加速能够在瞬间完成并且不会有交通堵塞等情况影响你。当然,你的车速不能超过当前的速度限制
输入输出格式
输入格式
第一行是3个整数 $ N $ , $ M $ 和 $ D \ (2 \leq N leq 150) $ ,表示道路的数目,用 $ 0..N-1 $ 标记。 $ M $ 是道路的总数, $ D $ 表示你的目的地。
接下来的 $ M $ 行,每行描述一条道路,每行有4个整数 $ A(0 \leq A<N) $ , $ B(0 \leq B<N) $ , $ V(0 \leq V \leq 500) $ and $ L(1 \leq L≤500) $ ,这条路是从A到B的,速度限制是 $ V $ ,长度为 $ L $ 。如果 $ V $ 是0,表示这条路的限速未知。
如果 $ V $ 不为0,则经过该路的时间 $ T=L/V $ 。否则 $ T=L/Vold $ , $ Vold $ 是你到达该路口前的速度。开始时你位于0点,并且速度为70。
输出格式
输出文件仅一行整数,表示从 $ 0 $ 到 $ D $ 经过的城市。
输出的顺序必须按照你经过这些城市的顺序,以 $ 0 $ 开始,以 $ D $ 结束。仅有一条最快路线。
输入输出样例
输入样例
6 15 1
0 1 25 68
0 2 30 50
0 5 0 101
1 2 70 77
1 3 35 42
2 0 0 22
2 1 40 86
2 3 0 23
2 4 45 40
3 1 64 14
3 5 0 23
4 1 95 8
5 1 0 84
5 2 90 64
5 3 36 40
输出样例
0 5 2 3 1
说明
【时空限制】
1000ms,128MB
思路
每一次转移时,还需要考虑速度,所以可以考虑开两维数组。
AC代码
#include<bits/stdc++.h>
const int maxn=160;
const int maxm=maxn*maxn;
const int maxv=510;
using namespace std;
int n,m,ed;
int tot,to[maxm],nxt[maxm],l[maxm],V[maxm],head[maxn];
double dis[maxn][maxv];
bool vis[maxn][maxv];
int ansv,Out[maxn],cnt;
struct Pre
{
int x,v;
}pre[maxn][maxv];
void Add(int u,int v,int mv,int len)
{
to[++tot]=v,nxt[tot]=head[u],l[tot]=len,V[tot]=mv,head[u]=tot;
}
void spfa()
{
memset(dis,66,sizeof(dis));
queue< pair<int,int> > q;
q.push(make_pair(1,70));vis[1][70]=true;dis[1][70]=0;
while(!q.empty())
{
int ux=q.front().first;
int uv=q.front().second;
q.pop();vis[ux][uv]=false;
for(int i=head[ux];i;i=nxt[i])
{
int vx=to[i];
int vv=(V[i]? V[i]:uv);
if(dis[vx][vv]>dis[ux][uv]+l[i]*1.0/vv)
{
pre[vx][vv]=(Pre){ux,uv};
dis[vx][vv]=dis[ux][uv]+l[i]*1.0/vv;
if(!vis[vx][vv])
{
q.push(make_pair(vx,vv));
vis[vx][vv]=true;
}
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&ed);ed++;
for(int i=1,u,v,mv,len;i<=m;i++)
scanf("%d%d%d%d",&u,&v,&mv,&len),u++,v++,Add(u,v,mv,len);
spfa();
for(int i=1;i<=maxv-5;i++) if(dis[ed][ansv]>dis[ed][i]) ansv=i;
int nx=ed,nv=ansv;
while(nx)
{
Out[++cnt]=nx;
int tmp1=pre[nx][nv].x;
int tmp2=pre[nx][nv].v;
nx=tmp1,nv=tmp2;
}
for(int i=cnt;i>=1;i--) printf("%d ",Out[i]-1);
return 0;
}
洛谷 P1266 速度限制 最短路+SPFA算法的更多相关文章
- 洛谷P1266速度限制
传送门啦 看起来是一个最短路问题,但是引入了速度限制,就要写一下二维最短路了. $ dis[i][j] $ :表示到i这个点,速度为j的最短时间. #include <iostream> ...
- 洛谷 P1266 速度限制
题目描述 在这个繁忙的社会中,我们往往不再去选择最短的道路,而是选择最快的路线.开车时每条道路的限速成为最关键的问题.不幸的是,有一些限速的标志丢失了,因此你无法得知应该开多快.一种可以辩解的解决方案 ...
- 洛谷P3371单源最短路径SPFA算法
SPFA同样是一种基于贪心的算法,看过之前一篇blog的读者应该可以发现,SPFA和堆优化版的Dijkstra如此的相似,没错,但SPFA有一优点是Dijkstra没有的,就是它可以处理负边的情况. ...
- 洛谷 P1266 速度限制 题解
题面 这道题可以理解为是一个分层图,也可以理解为是二维的SPFA dis[i][j]表示到达i这个点速度为j的最短路 然后跑已经死了的SPFA就好了: #include <bits/stdc++ ...
- 洛谷 P1342 请柬 最短路+Dijkstra算法
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1342 请柬 题目描述 在电视时代,没有多少人观看戏 ...
- 洛谷 P3805 【模板】manacher算法
洛谷 P3805 [模板]manacher算法 洛谷传送门 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入格式 一行小写英文字符 ...
- P1266 速度限制(分层图spfa)
P1266 速度限制 题目描述 在这个繁忙的社会中,我们往往不再去选择最短的道路,而是选择最快的路线.开车时每条道路的限速成为最关键的问题.不幸的是,有一些限速的标志丢失了,因此你无法得知应该开多快. ...
- 洛谷P1186 玛丽卡 spfa+删边
洛谷P1186 玛丽卡http://blog.csdn.net/huihao123456/article/details/73414139题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. ...
- 图论-单源最短路-SPFA算法
有关概念: 最短路问题:若在图中的每一条边都有对应的权值,求从一点到另一点之间权值和最小的路径 SPFA算法的功能是求固定起点到图中其余各点的的最短路(单源最短路径) 约定:图中不存在负权环,用邻接表 ...
随机推荐
- 在HBase之上构建SQL引擎
- HBase 面向列的存储
- kill 3000
杀3000端口,是作为一个web未开发人员经常遇到的事情 所以我今天就分享一下我的杀3000端口秘诀 lsof -i: 先要找到端口 node zcool 20u IPv6 0xdddbb4f6f12 ...
- light oj 1057 状压dp TSP
#include <iostream> #include <cstdlib> #include <cstring> #include <queue> # ...
- mysql高级教程(三)-----数据库锁、主从复制
锁 概念 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性. ...
- 【DM8168学习笔记5】EZSDK目录结构
EZSDK5.02的目录结构与之前的版本不同,之前的版本各个组件都放在/ezsdk目录下,5.02做了整合. 之前版本:(图片摘自:3.DM816x_1-day_Workshop-Getting_St ...
- PetaPoco 基础操作
//初始化数据库连接 var db=new PetaPoco.Database("connectionStringName"); //查询单个值 long count=db.Exe ...
- Vuejs实战项目:登陆页面
1.在view文件夹下创建login文件夹,创建index.vue:代表登录的组件 配置router.js,导入登录组件 import Vue from "vue"; import ...
- 09安装运行redis-trib.rb所需的环境
运行redis-trib.rb脚本配置Redis的cluster,需要安装ruby环境,这里采用源码安装: 1:下载源码包: https://cache.ruby-lang.org/pub/ruby/ ...
- hdu 5823 color II——子集dp(独立集)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5823 独立集染一种颜色.在这个基础上枚举子集来dp. 状压一样地存边真是美妙. 2^32是1ll<& ...