POI0109 POD (最短路)

版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址!

现在让我们来对一个交通运输图进行研究,这可能是一个公交车的线路网、有轨电车线路网、地下铁的线路网或是其他的一个什么。这个图中的顶点(从1到n标号)为车站,边(pi ,pj)(这里pi ¹ pj)表示在顶点pi和顶点pj间存在一条直接连接两点的路(1 £ pi, pj £ n)。在图中有从1到k编号的k条运输路线,第l号路线是用一个车站序列pl,1, pl,2, …, pl,sl来描述的,它们为使用这个线路的车辆将依次经过的车站。并且我们给出它们之间的距离rl,1, rl,2, …, rl,sl-1,其中rl,i表示从车站pl,i到车站pl,i+1所需的时间。对于一条线路来说,它上面所有的车站都是不相同的(也就是说,若i ¹ j,则pl,i ¹ pl,j)。且线路l将以频率cl运行。这里cl为集合{6, 10, 12, 15, 20, 30 ,60}中的一个数,它表示每个小时的0, cl, 2cl, …, 60分钟的时候在路线l上的将有两辆车同时从车站pl,1和pl,sl出发相对着行进。

在这样一个运输网络中,我们想从其中的一个车站x出发用尽可能少的时间到达车站y。这里我们假设最少的时间不会超过24个小时,且在中途换车的时候的时间不计。

示例:

在下图中你可以看到一个具有六个车站和两条路线的运输网络。路线一上的车站序列为1、3、4、6,路线二上的车站序列为2、4、3、5,且两条路线的频率分别为c1=15和c2=20。车辆在各车站间移动时的耗费都分别用1和2的下标标在了图上。

现在我们假设在23点30分的时候我们在车站5想要到车站6去。我们必须等上10分钟才可以搭上一辆路线2的车离开。然后我们就面临着两种选择:一种是在23点51分到车站3等上3分钟并改乘路线1的车于0点16分到达车站6;另一种是在0点8分到达车站4等上13分钟再换路线1的车于0点31分到达车站6。显然最早我们能在0点16分到达车站6。

任务:

请写一个程序:

l  从文本文件POD.IN中读入对该交通运输网的描述、起点和终点、还有出发的时间;

l  找出从起点到终点的最少时间;

l  把最找到达终点的时间输出到文本文件POD.OUT中。

输入格式:

在文本文件POD.IN的第一行包括六个用空格分开的整数,分别为:

l  n,1 £ n £ 1000,为车站的数目;

l  k,1 £ k £ 2000,为路线的数目;

l  x,1 £ x £ n,为起点的车站编号;

l  y,1 £ y £ n,为终点的车站编号;

l  gx,0 £ gx £ 23,为出发时间的小时数;

l  mx,0 £ mx £ 59,为出发时间的分钟数。

车站是从1到n编号的,运输路线是用1到k编号的。以下的3k行为对运输路线的描述。这些行中每3行构成一个对一条路线的描述,第k个三行的意义如下:

l  第一行包括两个用空格分开的整数,sl(2 £ sl£ n)为该路线上车站的数目,还有cl({6, 10, 12, 15, 20, 30, 60}中的一个元素),为该路线运行的频率;

l  第二行包括sl个用空格分开的不同的整数,为pl,1, pl,2, …,pl,sl(1£ pl,i£ n),即该路线上的车站;

l  第三行包括sl-1个整数rl,1, rl,2, …,rl,sl-1为在路线上相邻两个车站间移动所需的时间(1£ rl,i£ 240)。

在所有的运输路线上的总车站数不超过4000(也就是说s1 + s2 + … + sk £ 4000)。

输出格式:

你的程序应该在文本文件POD.OUT中输出两个整数gy(0£ gy£ 23)和my(0£ my£ 59),表示到达y点时的小时数和分钟数。

样例:

输入(POD.IN):

6 2 5 6 23 30
4 15
1 3 4 6
9 12 10
4 20
5 3 4 2
11 17 11

输出(POD.OUT):

0 16

解题报告

最短路中比较典型的模型的结合。对于每一条路线,我们把其站点上每一个点到其他点建立一条边,并记录发车频率于距离的前缀和,但要注意方向,如果为反方向就要用最后一个点的前缀和减去当前点的前缀和。

写一个等待函数,计算以当前状态(时间),如果要走当前的路要等待多久。在堆优dijkstra中加上一起松弛。复杂度为O(nlogn)

#include<bits/stdc++.h>
#define Pair pair<int,int>
#define MAXN 1000+10
#define MAXM 600000+1
using namespace std;
int n,m,num,head[MAXN],s,t,pre[MAXN],dis[MAXN],v[MAXM],hour,minute;
int s1[*MAXN][MAXN],s2[*MAXN][MAXN];
struct Edge{
int dis,next,to,exi,from,n,f;
}edge[MAXM];
void add(int from,int to,int dis,int exi,int n,int f)
{
edge[++num].next=head[from];
edge[num].to=to;
edge[num].f=f;
edge[num].dis=dis;
edge[num].from=from;
edge[num].n=n;
head[from]=num;
edge[num].exi=exi;
}
int read(){
int in=;
char ch=getchar();
for(;ch>''||ch<'';ch=getchar());
for(;ch>=''&&ch<='';ch=getchar()) in=in*+ch-'';
return in;
}
int wait(int dis,int x)
{
int minu=(dis-)%++;
if(edge[x].f==)
{
return (*edge[x].exi-((minu-(s2[edge[x].n][edge[x].from]%edge[x].exi))%edge[x].exi))%edge[x].exi;
for(int i=;i<=edge[x].exi;i++)
{
if((minu+i-(s2[edge[x].n][edge[x].from]%edge[x].exi))%edge[x].exi==)
return i;
}
}else
if(edge[x].f==)
{
int temp=s1[edge[x].n][s1[edge[x].n][]]-s2[edge[x].n][edge[x].from];
return (*edge[x].exi-(minu-(temp%edge[x].exi))%edge[x].exi)%edge[x].exi;
for(int i=;i<=edge[x].exi;i++)
if((minu+i-(temp%edge[x].exi))%edge[x].exi==) return i;
}
}
void dij()
{
memset(dis,,sizeof(dis));
memset(pre,,sizeof(pre));
memset(v,,sizeof(v));
priority_queue<Pair,vector<Pair>,greater<Pair> > h;
dis[s]=hour*+minute;
h.push(Pair(dis[s],s));
while(h.size()>)
{
int k=h.top().second;h.pop();
if(v[k]) continue;
v[k]=;
for(int i=head[k];i;i=edge[i].next)
{
int wa=wait(dis[k],i);
if(wa+dis[k]+edge[i].dis<dis[edge[i].to])
{
dis[edge[i].to]=dis[k]+edge[i].dis+wa;
pre[edge[i].to]=edge[i].from;
h.push(Pair(dis[edge[i].to],edge[i].to));
}
}
}
} int main()
{
freopen("pod.in","r",stdin);
freopen("pod.out","w",stdout);
n=read();m=read();s=read();t=read();hour=read();minute=read(); for(int i=;i<=m;i++)
{
int c=,sn=,l[MAXN];
memset(l,,sizeof(l));
sn=read();c=read();
s1[i][]=sn;
for(int j=;j<=sn;j++) l[j]=read();
for(int j=;j<=sn;j++)
s1[i][j]=read(),s1[i][j]+=s1[i][j-],s2[i][ l[j] ]=s1[i][j];
for(int j=;j<=sn;j++)
for(int h=j+;h<=sn;h++)
add(l[j],l[h],int(abs(s1[i][j]-s1[i][h])),c,i,),
add(l[h],l[j],int(abs(s1[i][j]-s1[i][h])),c,i,);
}
dij();
printf("%d %d\n",(dis[t]/)%,dis[t]%);
return ;
}
//6 10 12 15 18 24 30 36 40 42 45 48 50 54 60

POI0109 POD (最短路)的更多相关文章

  1. pod Spec管理配置

    pod Spec 为自己的项目添加pod管理功能.前言: 上一篇文章中提到,因为自己在操作的时候遇到很多坑,所在在此做一个记录,同样也希望可以帮到在这个操作上遇到坑的人. 本文将采用配图和加文字的方式 ...

  2. bzoj1001--最大流转最短路

    http://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路:这应该算是经典的最大流求最小割吧.不过题目中n,m<=1000,用最大流会TLE, ...

  3. 【USACO 3.2】Sweet Butter(最短路)

    题意 一个联通图里给定若干个点,求他们到某点距离之和的最小值. 题解 枚举到的某点,然后优先队列优化的dijkstra求最短路,把给定的点到其的最短路加起来,更新最小值.复杂度是\(O(NElogE) ...

  4. Sicily 1031: Campus (最短路)

    这是一道典型的最短路问题,直接用Dijkstra算法便可求解,主要是需要考虑输入的点是不是在已给出的地图中,具体看代码 #include<bits/stdc++.h> #define MA ...

  5. 最短路(Floyd)

    关于最短的先记下了 Floyd算法: 1.比较精简准确的关于Floyd思想的表达:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设maz ...

  6. iOS pod install update 慢!!!

    在终端输入: pod install --verbose --no-repo-update pod update --verbose --no-repo-update

  7. bzoj1266最短路+最小割

    本来写了spfa wa了 看到网上有人写Floyd过了 表示不开心 ̄へ ̄ 改成Floyd试试... 还是wa ヾ(。`Д´。)原来是建图错了(样例怎么过的) 结果T了 于是把Floyd改回spfa 还 ...

  8. 使用 pod install 还是 pod update ?

    翻译自:https://guides.cocoapods.org/using/pod-install-vs-update.html 介绍: 许多人开始使用CocodPods的时候认为pod insta ...

  9. HDU2433 BFS最短路

    Travel Time Limit: 10000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

随机推荐

  1. 读 Real-Time Rendering 收获 - chapter 6. texturing

    Texturing, at its simplest, is a techinique for efficiently modeling the surface's properties.

  2. HDU 1241 Oil Deposits【DFS】

    解题思路:第一道DFS的题目--- 参看了紫书和网上的题解-- 在找到一块油田@的时候,往它的八个方向找,直到在能找到的范围内没有油田结束这次搜索 可以模拟一次DFS,比如说样例 在i=0,j=1时, ...

  3. [Java] Protect, Private and Public的区别

    Java中的private.protected.public和default的区别 (2014-03-21 22:29:14) 转载▼ 标签: java java修饰符 it   (1)对于publi ...

  4. http扩展请求头中的x-Forwarded-For

    X-Forwarded-For格式: X-Forwarded-For: client-ip, proxy1-ip, proxy2-ip 客户端请求服务器的过程中没经过一个代理层(代理中使用了xff)那 ...

  5. SpringCloud学习笔记(14)----Spring Cloud Netflix之Hystrix对Feign的支持

    1. Hystrix对Feign的支持 添加Feign中IUserBiz的实现类HystrixFallBack: package com.wangx.cloud.springcloud02consum ...

  6. git clone 和 git pull 代码无响应

    记录一下今天 git 拉代码遇到的一些异常情况: 无论是项目目录下 git pull 还是直接 git clone 都不能正常拉代码: 异常情况1 ssh: connect to host gitee ...

  7. csv 模块的基本使用

    csv 模块专门用于读取和写入 csv 文件内容 以下主要讲在 python2 中的使用,在python3中有不同的地方,我会单独指出来 一般的excel表格可以保存为csv格式,然后就可以使用 cs ...

  8. Jtester使用

    1.在Jtester中使用DataMap 为什么要使用DataMap? 早先的jTester中提供了dbFit方式来准备和验证数据库数据,应该来说,这个工具解决了很多问题.实际使用过程中,开发同学反映 ...

  9. Ubuntu16.04 lnmp 环境搭建

    Ubuntu16.04 lnmp 环境搭建 nginx 安装 sudo apt-add-repository ppa:nginx/stablesudo apt-add-repository ppa:o ...

  10. VUEJS开发规范

    VUEJS开发规范 基于组件化开发理解 组件命名规范 结构化规范 注释规范 编码规范 基于组件化开发理解 什么是组件? ``` 组件其实就是页面组成的一部分,好比是电脑中的每一个元件(如硬盘.键盘.鼠 ...