uva 1161 Objective: Berlin (最大流+时序模型)

题意:你要从A地到B地去,并且最晚要在lt之前到达。现在给你m个航班信息,信息包括:起始地点,降落地点,载客上限,起飞时间,降落时间。中途转机要花费半小时的时间。问在lt之前,可以从A地到达B地的最多的游客数量。
分析:首先最大流模板中是不考虑时间因素的,从一个点分别向不同的方向出发是同时的,所以不能以城市为最大流模板中的顶点。为了考虑时间因素,以航班为顶点,以城市为边,将同一个航班拆成两个点i与i + m(拆点法),则i -> i + m的容量为航班的乘坐人数。(以航班为顶点,忽视了容量,因此要补充。)若两趟航班之间可以转(即第一个航班的降落时间与第二个航班的起飞时间至少相差30分钟),那么就将第一个航班的i + m连到第二个航班的i上去,容量为正无穷。(此处因为不确定容量,但是有同一航班间的容量限制,所以可以设为正无穷)。

以航班为节点进行建图。设置超级源点,连向所有起点为A地的航班,容量为INF;设置超级汇点,使所有降落地点为B点且降落时间在lt之前的航班连向超级汇点。每个航班都要拆成两个节点,中间的边容量为该航班的载客上限。如果i航班的降落地点等于j航班的起始地点,且i航班的降落时间+30 <= j航班的起飞时间,则连接i + m结点(拆出来的结点)和j结点。建完图求最大流。建图如下。

总结:时序模型,不再以城市为点,而把路(航班)当成点,再进行拆点建边。

代码:待补。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值