GYM 101606 K.Knightsbridge Rises(最大流-Dinic)

Problem K

Knightsbridge Rises

Description

现在有m

个重量分别为Ti的物品需要吊到楼上,有n个吊车,第i个吊车的重量为Wi,可以吊起的重量为Li,重量为0表示该吊车可以无代价的先放置在楼上以吊起重物或其他吊车,问如果安排吊车可以把这m

个重物都吊到楼上,一个吊车只能用一次

Input

第一行一整数n

表示吊车数量,之后n行每行两个整数Li,Wi表示第i个吊车可吊起的重量和自身的重量,之后输入一整数m表示要吊起的重物数,最后m个整数Ti表示第i个重物的重量
(1≤n,m≤100,0≤Li,Wi≤106,1≤Ti≤106)

 

Output

如果存在合法方案则输出m

行,第j行一个吊车编号序列a1,...,ak表示a1吊车可以直接放置在楼上,且第ai个吊车可以吊起第ai+1个吊车,1≤i<k,且第ak个吊车可以吊起j重物,否则输出imposiible

Solution

网络流,n个吊车看作两排n个点,拆点保证每个吊车至多用一次,m个重物看作m个点,建图如下:

1.源点向所有自身重量为0的吊车连容量为1的边表示这些吊车可以无代价放置在楼上

2.每个吊车拆成的第一个点向第二个点连容量为1的边来限流

3.如果Li≥Wj,即第i个吊车可以吊起第j个吊车,则从第i个吊车拆成的第二个点向第j个吊车拆成的第一个点连容量为1的边

4.如果Li≥Tj,即第i个吊车可以吊起第j个重物,则从第i个吊车拆成的第二个点向第j个重物连容量为1的边5.每个重物向汇点连容量为1的边,用最大流是否为m来判断是否所有的重物都可以被吊起

在最大流解决了方案的存在性之后,对整张网络的前向弧构成的图dfs,只走流量流完的边,来找到第i个重物是通过哪些吊车依次吊起的

这里用到一个骚操作,就是用dfs找到最大流上的点。因为这题每条边容量都为1,所以如果走过了就一定为零。

不知道为什么dinic才能过,以后最大流都用Dinic算法了哼

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值