【dp】海上交通控制

海上交通控制

描述

海上交通图可以用一个有向图来表示,顶点表示港口,边表示两个港口之间是否有航线可通。为保证海上交通安全和以尽量快的速度到达目的地,每艘船在出发前都将航行计划(包括出发时间、速度、出发与到达港口)提交给海上交通控制局,由海上交通控制局为它们制定航线。现给出一系列的船只航行计划(包括出发时间、速度、出发与到达港口),请你根据以下原则编程为它们制定航线:
1、 每艘船在出发的一瞬间提交航行计划(提交和出发的时间差可以忽略);
2、 每艘船都严格按照出发时间出发,不能提前,也不能延迟;
3、 在任何时间一条航道(两港口间的直达航线)上只能有一艘船,因此,一艘船在出发的瞬间发现某航道将在末来的某段时间内会被在它之前出发的船占用,则它在那一段时间内将不会使用该航道,当然其余时间还是可以使用该航道;
4、 每个港口均可被无限艘船同时使用;
5、 在满足上述条件后,要使本船航行的时间最短;
6、 假如某船不能到达目标港口,那么它将放弃这个航程;
7、 船在任何时候都不能停下来,即从出发后,要一直航行到目的地,中途不得在航道或港口中停留。
时间用4位数字表示如2345表示23:45,速度单位用节(海里/小时)表示。在计算时间时,中间结果应是精确的时间(即不要四舍五入到分钟),而航行时间的计算是以总距离除以速度为准,最终到目标地的时刻应是航行时刻加上航行时间的四舍五入到分钟的结果。

输入格式:

从当前目录下的文本文件“LANE.in”读入数据。输入的数据一定有解,且不会出现跨越00:00的情况,例如,一艘船在23:55出发,第二天0:15到达的情况是不会出现的。输入文件开头是港口定义:
第一行是港口数N(〈=26〉;
第二行是一个长度为N的大写字母串,每个字母表示一个港口名字;
第三行开始N行的N X N矩阵是一个邻接矩阵,每行有N个整数,其值为港口间距离(单位为海里),整数间以空格分隔(若为0表示两港口没有直达航线相连);
接着的一行是一个整数M(〈=50〉,表示共有M艘船提交航行计划;接下去的每3行表示一艘船的航行计划,其中第一行是船名,第二行是出发时间和航速,两者均为整数,以一个空格分隔,第三行是两个大写安母,之间没有任何分隔,第一个表示出发的港口,第二个表示目的港口;

输出格式:

答案输出到当前目录下的文本文件“LANE.OUT”中。该文件的每3行表示一艘船的航线,其中第一行是船名,第二行是出发时间和到达时间,两者均为整数,以一个空格分隔,第三行是数个大写字母,之间没有任何分隔,表示该船经过的港口(包括出发和目的港口)。如果这艘船放弃航程时,到达时间用-1来表示,并留空第三行。
注意:在输入和输出中航行计划和航线均按出发时间排序,时间精确到分钟。

输入输出举例:

输入文件:LANE.in

5
ABCDE
0 10 0 50 10
10 0 20 70 0
0 20 0 20 0
50 70 20 0 10
10 0 0 10 0
4
Bluesky
0800 10
CB
Blackhorse
0900 5
AB
Greenforest
1000 20
DB
Silverboat
1200 20
DC

输出文件:LANE.OUT

Bluesky
800 1000
CB
Blackhorse
900 1100
AB
Greenforest
1000 1130
DEAB
Silverboat
1200 1300
DC

这个题是在一篇在讲DP的doc里面看到的,网上查了一下,也没有解答,想了许久,也跟同学讨论了许久,虽然不一定是最优做法,但我觉得应该没有是可以通过。
不过,也没找到数据,题解,反正就是什么也没有,也不想写代码了,自己就来写一写思路就好了。
直接给每一条边建一个数组,因为题目要求当前船最大,自然就没有两条船一起出发,每条边建一条数组存什么时候不能走,可以直接用区间把每个时间括起来(注意:此时不能建一个2400的表示时间的数组,因为时间有可能不是整数)
然后每次有船要走就Dijkstra,在每次通过某条边更新时,就判断时间是否符合,不符合就直接弹出,符合就更新。然后找到最优路径后,把所走边的经过时间区间增加上这条船的就可以了。
还需要注意的是,这道题要存的东西很多,编写的时候一定要注意。
我这里也没空写代码,发表一下自己的思路,如果有疑问,问题的,欢迎提出。
谢谢。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值