Spfa【P1813】拯救小tim_NOI导刊2011提高(02)
Description
小tim在游乐场,有一天终于逃了出来!但是不小心又被游乐场的工作人员发现了„„所以你的任务是安全地把小tim护送回家。但是,A市复杂的交通状况给你出了一大难题。
A市一共有n个路口,m条单行马路。但是,每条马路都只有一段时间是开放的。为了安全,你必须选择一条护送路线,使得小tim在路上的时间最短,即到家的时刻减去离开游乐场的时刻最短。
Input
第一行4个数,分别是n,m,s,t(2≤n≤100;0≤m≤l000;1≤s,t≤n;s≠t)。基地在路口s,码头在路口t。
接下来m行每行5个数x,y,b,e,c表示一条x路口到y路口的单行线,在b时刻到e时刻之间开放,需要c的时间通过这条路(必须保证行进在路中间时,路一直开放,否则小tim会被捉住)。两个路口之间可能会有多条道路。一开始的时刻是0(当然,你可以不用马上出发,在基地多呆一段时间)。
如果不存在任何一种方案使得小tim能成功到达码头,输出“Impossible”。
Output
一行,为小tim在路上停留的最短时间。
首先,我们需要从\(s\)出去,则必须要考虑从\(s\)连出的边最早的开放时间.不能考虑其他边的开放时间.
因此,开始时间要考虑从\(s\)连出的边.
(考虑所有边的最早开放时间是会\(Wa\)掉的 qwq)
我们设\(dis[i]\)代表到达\(i\)点的最早时间.
考虑到达一个新的地方,我们可能停留,又可能迟到其上一个地方.因此对于某一条道路的开放时间和到达上一个地方的时间我们要取\(max\)
即\(dis[v]=max(dis[u],edge[i].a)+edge[i].w\)。
注意到这个的话,从\(s\)开始跑最短路即可.
由于时间未知,因此我们枚举从\(s\)出发的时间来得到到达\(t\)的最短时间。
注意,要判断能否到达\(t\)点.
代码
#include<cstdio>
#include<queue>
#include<iostream>
#include<cctype>
#define N 1008
#define R register
using namespace std;
inline void in(int &x)
{
int f=1;x=0;char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s)){x=x*10+s-'0';s=getchar();}
x*=f;
}
int n,m,s,t,head[N],tot,dis[N];
int begin=2147483644,end=-2147483644,ans=2147483647;
struct cod{int u,v,w,a,b;}edge[N<<1];
bool vis[N];
inline void add(int x,int y,int z,int a,int b)
{
edge[++tot].u=head[x];
edge[tot].v=y;
edge[tot].w=z;
edge[tot].a=a;
edge[tot].b=b;
head[x]=tot;
}
inline void spfa(int tm)
{
for(R int i=1;i<=n;i++)dis[i]=2147483647,vis[i]=false;
queue<int>q;q.push(s);vis[s]=true;dis[s]=tm;
while(!q.empty())
{
int u=q.front();q.pop();vis[u]=false;
for(R int i=head[u];i;i=edge[i].u)
{
if(max(dis[u],edge[i].a)+edge[i].w<=edge[i].b)
{
if(max(dis[u],edge[i].a)+edge[i].w<dis[edge[i].v])
{
dis[edge[i].v]=max(dis[u],edge[i].a)+edge[i].w;
if(!vis[edge[i].v])
{
vis[edge[i].v]=true;
q.push(edge[i].v);
}
}
}
}
}
}
int main()
{
in(n),in(m),in(s),in(t);
for(R int i=1,x,y,b,e,c;i<=m;i++)
{
in(x),in(y),in(b),in(e),in(c);
if(x==s)begin=min(begin,b);end=max(end,e);
add(x,y,c,b,e);
}
for(R int i=begin;i<=end;i++)
{
spfa(i);
if(dis[t]==2147483647)continue;
ans=min(ans,dis[t]-i);
}
if(ans==2147483647)puts("Impossible");
else printf("%d",ans);
}
Spfa【P1813】拯救小tim_NOI导刊2011提高(02)的更多相关文章
- 贪心—— P1809 过河问题_NOI导刊2011提高(01)
洛谷——P1809 过河问题_NOI导刊2011提高(01) 题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能 ...
- P1836 【数页码_NOI导刊2011提高(04)】
P1836 数页码_NOI导刊2011提高(04) 题目描述 一本书的页码是从1—n编号的连续整数:1,2,3,…,n.请你求出全部页码中所有单个数字的和,例如第123页,它的和就是1+2+3=6. ...
- 洛谷 P1808 单词分类_NOI导刊2011提高(01)
P1808 单词分类_NOI导刊2011提高(01) 题目描述 Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类. 两个单词可以分为一类当且仅当 ...
- 洛谷P1808 单词分类_NOI导刊2011提高(01) 字符串排序
洛谷P1808 单词分类_NOI导刊2011提高(01) 题目描述 Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类. 两个单词可以分为一类当且 ...
- 素数密度_NOI导刊2011提高(04)
题目描述 给定区间[L, R](L <= R <= 2147483647,R-L <= 1000000),请计算区间中素数的个数. 输入 两个数 L 和 R. 输出 一行,区间中素数 ...
- 洛谷P1809 过河问题_NOI导刊2011提高(01)
To 洛谷.1809 过河问题 题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时 ...
- luogu P1809 过河问题_NOI导刊2011提高(01)
题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时间T,船划到对岸的时间等于船上渡 ...
- P1809 过河问题_NOI导刊2011提高(01)
题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时间T,船划到对岸的时间等于船上渡 ...
- [luoguP1835] 素数密度_NOI导刊2011提高(04)(素数筛)
传送门 数据辣么大,怎么搞?(L≤R≤2147483647) 注意到R-L≤1000000 所以可以直接筛R-L区间内的数, 但是需要用已知的小的素数筛, R-L区间内的大部分数肯定能用较小的素数筛去 ...
随机推荐
- global js库
var GLOBAL = {}; GLOBAL.namespace = function(str) { var arr = str.split("."), o = GLOBAL,i ...
- (原)Unreal渲染相关的缓冲区 及其 自定义代码几种抓取
@authot: 白袍小道 转载说明那啥即可. (图片和本文无关,嘿嘿,坑一下) 以下为Unreal4.18版本中对GPUBuffer部分的分析结果 (插入:比之够着,知至目的) ...
- Scrapy爬取到的中文数据乱码问题处理
Scrapy爬取到中文数据默认是 Unicode编码的,于是显示是这样的: "country": ["\u56fd\u4ea7\u6c7d\u8f66\u6807\u5f ...
- python命名空间、作用域、闭包与传值传引用
(以下内容,均基于python3) 最近在看python函数部分,讲到了python的作用域问题,然后又讲了Python的闭包问题. 在做作业的时候,我遇到了几个问题,下面先来看作业. 一. 作业1: ...
- HDU 4057 Rescue the Rabbit ( AC自动机 + 状态压缩DP )
模板来自notonlysuccess. 模式串只有10个,并且重复出现的分值不累加,因此很容易想到状态压缩. 将模式串加入AC自动机,最多有10*100个状态. dp[i][j][k]:串长为i,在T ...
- android DOM解析Xml
文章转自:http://blog.sina.com.cn/s/blog_a661f16c0101d5qp.html People类是自己写的一个类,主要保存各个字符串数据. 由于没学过Xml语法只 ...
- BETA(1)
目录 组员情况 组员1(组长):胡绪佩 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最新成果 团 ...
- struts框架搭建
struts是开源框架.使用Struts的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间.如果我们想混合使用Servlets和JSP的优点来建立可扩展的应用,struts是一个不错的 ...
- 【bzoj1511】[POI2006]OKR-Periods of Words KMP-next数组
原文地址:http://www.cnblogs.com/GXZlegend/p/6827027.html 题目描述 一个串是有限个小写字符的序列,特别的,一个空序列也可以是一个串. 一个串P是串A的前 ...
- 【bzoj1565】[NOI2009]植物大战僵尸 拓扑排序+最大权闭合图
原文地址:http://www.cnblogs.com/GXZlegend/p/6808268.html 题目描述 输入 输出 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何 ...