1.编码
用一个int表示电脑的一种状态,其中最低的二进制位表示第一个部件的状态,最高的二进制位表示最后一个部件的状态,1代表存在,0代表不存在
2.建图
图中的点包括电脑所有的状态,共有2^p个点;和机器,共n个点。由题意可知,一台机器可以加工多种不同状态的电脑,但是产生的电脑的状态可以唯一确定。加边过程为:对于每个机器。将它与它产生的电脑状态点之间建立一条容量为机器的performance的边;对于每个状态点,将它与它满足条件的机器之间建立一条边,容量为performance或者inf都可以无所谓了.........
3.算法
求最大流即可
dinic算法或者EK都可以,本题中C++编译器Ek快一些,G++ Dnic快一些
4.输出
本题还要求输出机器之间的流量,我采用的直观但是低效方法如下:
在执行算法时把进入每台机器的流量记录下来
建立一个从pair 到int的map,用来储存first到secon的流量
前面已经提到过,每台机器生产出的产品是固定的一个,所以对于每台机器,找到它的产品,然后遍历这个产品的边,如果流量大于0,就存到map里。直到这台机器的流量用完,需要这么做是因为有可能出现多台机器产出同样的产品的情况,需要避免重复
C++ EK 算法 0ms hhhh
#include
#include
#include
#include
#include
Dinic
#include
#include
#include
#include
#include