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算法了哼