题面

题目链接

P1266 速度限制

题目描述

在这个繁忙的社会中,我们往往不再去选择最短的道路,而是选择最快的路线。开车时每条道路的限速成为最关键的问题。不幸的是,有一些限速的标志丢失了,因此你无法得知应该开多快。一种可以辩解的解决方案是,按照原来的速度行驶。你的任务是计算两地间的最快路线。

你将获得一份现代化城市的道路交通信息。为了使问题简化,地图只包括路口和道路。每条道路是有向的,只连接了两条道路,并且最多只有一块限速标志,位于路的起点。两地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算法的更多相关文章

  1. 洛谷P1266速度限制

    传送门啦 看起来是一个最短路问题,但是引入了速度限制,就要写一下二维最短路了. $ dis[i][j] $ :表示到i这个点,速度为j的最短时间. #include <iostream> ...

  2. 洛谷 P1266 速度限制

    题目描述 在这个繁忙的社会中,我们往往不再去选择最短的道路,而是选择最快的路线.开车时每条道路的限速成为最关键的问题.不幸的是,有一些限速的标志丢失了,因此你无法得知应该开多快.一种可以辩解的解决方案 ...

  3. 洛谷P3371单源最短路径SPFA算法

    SPFA同样是一种基于贪心的算法,看过之前一篇blog的读者应该可以发现,SPFA和堆优化版的Dijkstra如此的相似,没错,但SPFA有一优点是Dijkstra没有的,就是它可以处理负边的情况. ...

  4. 洛谷 P1266 速度限制 题解

    题面 这道题可以理解为是一个分层图,也可以理解为是二维的SPFA dis[i][j]表示到达i这个点速度为j的最短路 然后跑已经死了的SPFA就好了: #include <bits/stdc++ ...

  5. 洛谷 P1342 请柬 最短路+Dijkstra算法

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1342 请柬 题目描述 在电视时代,没有多少人观看戏 ...

  6. 洛谷 P3805 【模板】manacher算法

    洛谷 P3805 [模板]manacher算法 洛谷传送门 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入格式 一行小写英文字符 ...

  7. P1266 速度限制(分层图spfa)

    P1266 速度限制 题目描述 在这个繁忙的社会中,我们往往不再去选择最短的道路,而是选择最快的路线.开车时每条道路的限速成为最关键的问题.不幸的是,有一些限速的标志丢失了,因此你无法得知应该开多快. ...

  8. 洛谷P1186 玛丽卡 spfa+删边

    洛谷P1186 玛丽卡http://blog.csdn.net/huihao123456/article/details/73414139题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. ...

  9. 图论-单源最短路-SPFA算法

    有关概念: 最短路问题:若在图中的每一条边都有对应的权值,求从一点到另一点之间权值和最小的路径 SPFA算法的功能是求固定起点到图中其余各点的的最短路(单源最短路径) 约定:图中不存在负权环,用邻接表 ...

随机推荐

  1. 2018-12-18-WPF-一个空的-WPF-程序有多少个窗口

    title author date CreateTime categories WPF 一个空的 WPF 程序有多少个窗口 lindexi 2018-12-18 21:16:40 +0800 2018 ...

  2. Luogu P3007 [USACO11JAN]大陆议会The Continental Cowngress

    P3007 [USACO11JAN]大陆议会The Continental Cowngress 题意 题意翻译 简述:给出\(n\)个法案,\(m\)头牛的意见,每头牛有两个表决格式为"支持 ...

  3. LeetCode404Sum of Left Leaves左叶子之和

    计算给定二叉树的所有左叶子之和. 示例: 3 / \ 9    20 / \ 15   7 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 class Solution { pub ...

  4. JZOJ5967 常数国

    题目 像素有点低啊~ 算了凑合一下就好啦~ 题目大意 给你一个首尾相接的数列,每次对一个区间进行操作: 顺时针操作,如果当前值比vvv大,就交换.输出最后的vvv. 比赛思路 首先这题的时限这么仁慈, ...

  5. java中通过jacob调用dts进行数据导入导出

    在一个项目中需要金蝶软件对接,但是业务服务器和财务服务器相隔很远(中间经过好几台服务器,有内网也有外网),从一个内网向另一个内网中传输时,需要外网辅助,因为不让原始数据受污染,使用了DTS数据同步到另 ...

  6. Spring注解驱动开发(七)-----servlet3.0、springmvc

    ServletContainerInitializer Shared libraries(共享库) / runtimes pluggability(运行时插件能力) 1.Servlet容器启动会扫描, ...

  7. WebConfig配置文件

    <?xml version="1.0"?> <!--注意: 除了手动编辑此文件以外,您还可以使用 Web 管理工具来配置应用程序的设置.可以使用 Visual S ...

  8. 如何理解张量tensor

    1 关于张量的四种定义 “张量”在不同的运用场景下有不同的定义. 第一个定义,张量是多维数组,这个定义常见于各种人工智能软件.听起来还好理解.--本文仅解释此种 2 多维数组 从第一个定义:张量是多维 ...

  9. TZOJ 3522 Checker Challenge(深搜)

    描述 Examine the 6x6 checkerboard below and note that the six checkers are arranged on the board so th ...

  10. (大概是最全的解决方法)使用bandicam录制视频导入pr后音画不同步问题

    遇到这个问题大部分都是使用了VBR来录制视频导致的, 搜集了各种能够找到的方法,并没有每个尝试过 一 Handbrake转码 Audio out of sync AFTER importing 解决方 ...