C - 秋实大哥与时空漫游

Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

秋实大哥通过全国的连锁快餐店发家致富,赚了大钱,接下来他打算通过这些钱实现他的另一个梦想————遨游太空,漫游星际。

秋实大哥满怀期待的出发了。

.......啦啦啦啦啦啦啦啦啦......

最后,秋实大哥花完了钱,觉得是时候回地球继续赚钱和过节了。

但是却被告知回地球的专机只有一架————在Tp星球且在Tt时刻起飞(因此必须要在Tt时刻之前到达该Tp星球),而秋实大哥现在所处的时空是Sp星球上的St时刻。为了能赶上那班回地球的专机,秋实大哥可以使用一系列的时空传送门。

(时空传送门是发达星球的日常交通产物,而像地球这样的发展中星球只有最原始的宇宙飞船。)

每个传送门有4个属性,起点星球a,终点星球b,起点时刻c,终点时刻d。如果秋实大哥想使用某时空传送门,那么他就必须在c时刻之前到达星球a,然后等到c时刻他就可以通过该传送门到达d时刻的星球b。

在任意时刻,如果在同一星球上有两个秋实大哥,就会引发“祖父悖论”!

这就犯了时空漫游的大忌,时空就会扭曲,宇宙就会产生巨大的黑洞甚至引发降维,世界就会毁灭!

得知稍有不当就会毁灭世界,秋实大哥现在很慌,不知道到底怎么走才能赶上回地球的末班车。

但是迫不及待想见到秋实大哥的你马上给出了正确答案。

Input

第一行一个整数N,M,分别表示星球的个数和传送门的个数

接下来M行,表示每个传送门的四个属性ai,bi,ci,di。

最后一行四个整数Sp,Tp,St,Tt分别表示秋实大哥所处的初始时刻和星球,以及末班车的地点和时间。

1≤Sp,Tp,ai,bi≤N

0≤St,Tt,ci,di≤107

N≤105,M≤5×105

Output

如果秋实大哥无论如何都不能赶上,输出-1

否则:

第一行一个整数k,表示秋实大哥所要经历的传送门个数。

第二行k个整数,按顺序输出秋实大哥使用传送门编号(从1开始编号)。

任意的合法解都是支持的。

Sample input and output

Sample Input Sample Output
3 3
1 2 4 2
2 1 2 1
1 1 1 0
1 1 3 0
3
1 2 3
3 3
1 2 4 2
2 1 2 1
1 1 1 0
1 2 0 1
-1

解题思路:

抓住题目的重要条件 :通过传送门到达的另外一个点的时间是固定的!!!

1.令 arrive[i] 表示能够到达 i 星球的最早时刻.<其实理解之后这个arrive[i]完全可以换成第多少个传送门>

-> 对所有点的边按照出发时间从 小到大 排序.(这步非常重要)

2.用 use[i] 表示对于点 i 来讲,已经跑完了  use[i] + 1 -> E[i].size() - 1 这些边,0 - > use[i] 这些边还没有跑

3.跑 spfa , 对于某个点来讲,如果新过去的时间大于等于 E[  use[target] ].begtime , 更新即可

但是,这样做为什么是对的呢?

如果过去的时间没有到达下一个传送门所要求的时限,那么我们根据题目的重要条件,到达其他星球的时间根本不会变化,所以这是没有必要的!

例子: 某星球的传送门开启时刻(已排序)

10 50 100 200 300

假定现在arrive[this_plant] = 175(即目前到达这个星球的最早时间是 175 )

那么假如现在,我可以从某个另外一个星球到达这个星球的时间是 101 ,那么有必要入队么?显然没有必要,入了也没用,你能搞的传送门还是后面几个,同时根据题目

的重要条件(※),对其他点的arrive[]不会产生影响,所以不入队

那么如果这个时间是 75 呢,显然必须入队了, 因为这个时候又可以走一个新的传送门 100 了,所以说这个时候是需要入队的!

根据这个例子,肯定也就知道给点的边出发时间排序的作用了.

但是这题的关键是找路径,一种办法是记录边的前驱边(但是我WA了很多次,虽然逻辑上认为是对的,但。。。。事实太残酷)

后来我思考后,发现边的前驱其实是可以,但是我们需要加上一个虚拟边,就是终点的传送门边,这样才能正确,具体。。就没有实现了

后来AC使用的办法是队列位置回溯,因为题目并不要求最短路径,那么一旦到达了终点且时间≤起飞时间,就立即停止spfa,并通过回溯队列位置找答案.

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
const int maxn = 6e5;
const int maxsize = 1e6 + ;
const int inf = << ; typedef struct Edge
{
int v,c,d,id;
Edge(const int &v,const int &c,const int &d,const int &id)
{
this->v = v , this->c = c , this->d = d , this->id = id;
}
friend bool operator < (const Edge & x,const Edge& y)
{
return x.c > y.c;
}
}; int q[maxsize];
int pre[maxsize];
int door[maxsize];
int TIME[maxsize];
int use[maxn];
int n,m,sp,tp,st,tt;
int arrive[maxn];
int front = , rear = ;
vector<Edge>E[maxn];
stack<int>ans; void spfa()
{
for(int i = ; i <= n ; ++ i)
arrive[i] = inf;
arrive[sp] = st;
memset(use,,sizeof(use));memset(pre,-,sizeof(pre));
q[rear] = sp , TIME[rear] = st , pre[rear++] = - ;
while(front < rear)
{
int x = q[front];
int cmp = TIME[front];
if (x == tp && cmp <= tt) break; //到达终点,立即退出
for( ; use[x] < E[x].size() && E[x][use[x]].c >= cmp ; ++ use[x] )
{
int v= E[x][use[x]].v;
if (arrive[v] > E[x][use[x]].d)
{
arrive[v] = E[x][use[x]].d;
door[rear] = E[x][use[x]].id;
pre[rear] = front;
TIME[rear] = E[x][use[x]].d;
q[rear++] = v;
}
}
front++;
}
} int main(int argc,char *argv[])
{
scanf("%d%d",&n,&m);
for(int i = ; i < m ; ++ i)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
E[a].push_back(Edge(b,c,d,i+));
}
for(int i = ; i <= n ; ++ i)
sort(E[i].begin(),E[i].end());
scanf("%d%d%d%d",&sp,&tp,&st,&tt);
spfa();
if (arrive[tp] > tt)
printf("-1\n");
else
{
int cur = front;
while(pre[cur] != -)
{
ans.push(door[cur]);
cur = pre[cur];
}
printf("%d\n",ans.size());
int flag = ;
while(!ans.empty())
{
if (flag)
flag = ;
else
printf(" ");
printf("%d",ans.top());ans.pop();
}
printf("\n");
}
return ;
}

UESTC_秋实大哥与时空漫游 2015 UESTC Training for Graph Theory<Problem C>的更多相关文章

  1. UESTC_秋实大哥与连锁快餐店 2015 UESTC Training for Graph Theory<Problem A>

    A - 秋实大哥与连锁快餐店 Time Limit: 9000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) S ...

  2. UESTC_秋实大哥与线段树 2015 UESTC Training for Data Structures<Problem M>

    M - 秋实大哥与线段树 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Sub ...

  3. UESTC_秋实大哥与妹纸 2015 UESTC Training for Data Structures<Problem F>

    F - 秋实大哥与妹纸 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 1500/1500KB (Java/Others) Submit ...

  4. UESTC_秋实大哥の恋爱物语 2015 UESTC Training for Search Algorithm & String<Problem K>

    K - 秋实大哥の恋爱物语 Time Limit: 5000/2000MS (Java/Others)     Memory Limit: 32000/32000KB (Java/Others) Su ...

  5. UESTC_秋实大哥带我飞 2015 UESTC Training for Graph Theory<Problem B>

    B - 秋实大哥带我飞 Time Limit: 300/100MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  6. UESTC_排名表 2015 UESTC Training for Graph Theory<Problem I>

    I - 排名表 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit S ...

  7. UESTC_方老师和农场 2015 UESTC Training for Graph Theory<Problem L>

    L - 方老师和农场 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  8. UESTC_王之盛宴 2015 UESTC Training for Graph Theory<Problem K>

    K - 王之盛宴 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  9. UESTC_小panpan学图论 2015 UESTC Training for Graph Theory<Problem J>

    J - 小panpan学图论 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) S ...

随机推荐

  1. 【转】Android HAL实例解析

    原文网址:http://www.embedu.org/Column/Column339.htm 作者:刘老师,华清远见嵌入式学院讲师. 一.概述 本文希望通过分析台湾的Jollen的mokoid 工程 ...

  2. VM虚拟机安装苹果雪豹操作系统

    1.win xp虚拟机安装Mac OSX 一.用VM8安装mac os x10.6 ,然后升级到的10.6.8,如何安装vm大家自己百度吧.这里指列出了如何安装雪豹操作系统. DMG是mac os x ...

  3. /etc/fstab 文件详解 及 /etc/mtab

    /etc/fstab 文件解释 文件fstab包含了你的电脑上的存储设备及其文件系统的信息.它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的唯一文件. 这个文件的全路径是/etc/fstab ...

  4. Java vs Python

    面试时常问到这两种语言的区别,在此总结一下. Referrence: Udemy:python-vs-java Generally, Python is much simpler to use, an ...

  5. Copy Constructor in Java

    Reference: TutorialPoints, GeekforGeeks The copy constructor is a constructor which creates an objec ...

  6. 利用智能手机(Android)追踪一块磁铁(二)

    在上一篇博客中提到了利用磁场强度推算传感器位置坐标的公式,下面就介绍怎么利用智能手机完成磁铁的追踪(任何具有磁感应器的装置均可以),这里主要是利用Android手机. 1:程序步骤: 首先将磁铁放置在 ...

  7. sqlserver练习

    1.基本表的练习: create table Test( name ), age int, sex ) ) alter table Test ) alter table Test ) alter ta ...

  8. 零拷贝概念 -- linux内核

    零拷贝(zero-copy) 备快速网络接口的主要技术. 零拷贝技术通过降低或消除关键通信路径影响速率的操作,降低传输数据的操作系统开销和协议处理开销,从而有效提高通信性能,实现快速传输数据. 零拷贝 ...

  9. git 远程分支创建与推送

    git 远程分支创建与推送   原文地址:http://hi.baidu.com/lingzhixu/blog/item/4a9b830bb08a329fe850cd5b.html 本地分支的创建 本 ...

  10. jquery使用load开展局部刷新没有效果

    jquery使用load开展局部刷新没有效果   jquery使用load进行局部刷新没有效果我的代码 <html><head><meta charset="u ...