A - Graph
没啥好说的,直接设个未知数然后解个方程。
如果 (x) 解不出来,那么就枚举断点。
17分调了好久,以为是精度问题,实际是很 sb 的错误。
静查很重要!
B1 - Village (Minimum)
对于一个菊花答案其实明显就是 2*花瓣。
然后对于一棵树进行菊花剖分,这样每一个菊花都是局部最优解,然后发现菊花间交错肯定不是更优。
如果剩下一个点可以并入任意一个菊花。
严谨一点:下界其实是 2*(n-匹配数),而这个下界可以达到。
B2 - Village (Maximum)
为啥我感觉比 B1 还要简单
直接搞上界就是 (sum_{e} min(n-sz_u,sz_u)) ,重心找到交错分配。
C - Viruses
整理一下数据:(G) 表示基因数,(m) 表示抗体数, (sum k leq 100) 表示基因转移个数, (sum l leq 50) 表示抗体总长,(G leq sum k)。
考虑 (m=0) 的部分分,直接转移跑最短路。
(m=1) 时,记三维 (i,st),(ed) 表示以第 (i) 基因为基础繁衍,和那个抗体前缀后缀的最长匹配分别为 (st,ed),然后两个基因合并的时候就是把后一个的前缀加入跑 (KMP) 不能变成基因串。
当 (m) 多的时候很自然就把 (KMP) 改成 (AC) 自动机,然后对于前缀和后缀各建一棵 (AC) 自动机,然后记两维表示在哪个节点,但好像这种方法很烦。。
再换一种 (dp) 设法,(i,st,ed) 表示原本在 (AC) 自动机上在 (st) ,现在在 (ed),经过的变换是以 (i) 为基础的,最短长度。
然后跑 (SPFA),每次对于所有转移条件都跑一次,对于一个转移,就是依次添加字符跑 (Floyd) 更新。直到所有 (dp) 状态跑完一遍没有变为止。
状态数 (G (sum l)^2),设增广次数为 (T),则复杂度 (Tsum k(sum l)^3),信仰能过。