洛谷 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算法的功能是求固定起点到图中其余各点的的最短路(单源最短路径) 约定:图中不存在负权环,用邻接表 ...
随机推荐
- spring boot 项目添加maven依赖时provided
spring boot 项目是自带tomcat 的,但是我们有时候是需要把项目打包成war 然后放到独立的tomcat中运行的,这个时候我们就需要将它自带的tomcat给排除开,这时候我们就可以使用& ...
- Luogu P1429 平面最近点对(加强版)(分治)
P1429 平面最近点对(加强版) 题意 题目描述 给定平面上\(n\)个点,找出其中的一对点的距离,使得在这\(n\)个点的所有点对中,该距离为所有点对中最小的. 输入输出格式 输入格式: 第一行: ...
- PostgreSQL的架构
是最先进的数据库.他的第一个版本在1989年发布,从那时开始,他得到了很多扩展.根据db-enginers上的排名情况,PostgreSQL目前在数据库领域排名第四. 本篇博客,我们来讨论一下Post ...
- c++设计模式:模板模式
模板模式和策略模式的区别: 模板方法模式的主要思想:定义一个算法流程,将一些特定步骤的具体实现.延迟到子类.使得可以在不改变算法流程的情况下,通过不同的子类.来实现“定制”流程中的特定的步骤. 策略模 ...
- 最全的CSS hack没有之一
1.何为HACK? 简单的说,HACK就是只有特定浏览器才能识别这段hack代码.Hack也可以说是让前端最为头疼的问题,因为要写N多种兼容代码.当然,IE是最让人蛋疼的. 一般来说,CSS HACK ...
- javascript中json对象与json字符串
var data = "{'name':'张山','age':20}"; //转换字符串为json对象: var jsondata = JSON.parse(data); //转换 ...
- 攻防世界wp--web新手1
https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5061 打开是一个网页 知识点: 根 ...
- org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider]
从hibernate3升级到4应该会遇到 应该添加引用 <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0 ...
- hdu3853之概率dp入门
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/xingyeyongheng/article/details/25205693 LOOPS Time ...
- VS2013 IIS Express8.0
1.下载最新版本的 Microsoft Web Platform Installer 5.0. 2.在组件列表中选择最新版本的 WebMatrix 3.0,安装重启后即可正常使用 IIS Expres ...