题目链接:点击查看
题目大意:给出 n 个工人,再给出 m 台机器,第 i 个工人和第 j 台机器匹配的代价是 a[ i ] * j * j + b[ i ] * j + c[ i ] ,问如何进行匹配,可以使得代价和最小
题目分析:代价可以视为二次函数,且数据范围限制了系数 a 是大于 0 的,换句话说,二次函数的开口向上,这样函数就存在着最小值
考虑 n 最大只有 50 ,所以我们可以对于每个工人的二次函数,求出与其匹配所花费代价的前 n 小的位置,求出这些位置之后,直接将工人与机器连边求解就好了,因为每个工人都与 n 个机器建边,所以最终一定可以达到完全匹配,最终有 n 个工人,n * n 台机器,而 spfa 实现的费用流总时间复杂度会退化为 n^5 ,但常数较小,跑起来还是非常快的
代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include