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结点。建完图求最大流。建图如下。

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

代码:待补。

猜你喜欢

转载自blog.csdn.net/tianwei0822/article/details/92794645