题目链接
题目大意
给一颗 \(n\) 个节点的树,每个边上有一个守卫。有 \(m\) 个居民,每个居民有一个散步路径(两个节点的树上最短路)。一个居民高兴当且仅当他获得了一个宠物或者他散步的路径上所有的守卫都有宠物。宠物可以分配给居民或者守卫者。求最少需要几只宠物才能让所有居民高兴。输出方案。
思路
假设多一条狗对于答案的贡献为 \(-1\)。
先让 \(m\) 个居民人手一只狗,则贡献为 \(-m\)。
考虑最大权最大子图。则居民放弃一只狗的贡献为 \(1\),守卫得到一只狗的贡献为 \(-1\)。
且居民放弃狗会限制守卫得到狗,则答案就为 \(-(m-(m-mincut))=mincut=maxflow\)。
普通建图的时间复杂度为 \(O(nm)\),但是连边在树上一段连续的边中进行,参考的思路,用线段树(树剖)优化连边。
则 \(u\to[l,r]\) 可以优化为 \(u\to[l_1,r_1],u\to[l_2,r_2],\dots,u\to[l_k,r_k]\),使得 \([l_i,r_i]\) 的并集为 \([l,r]\),且没有交集,则通过 \([l_i,r_i]\) 到叶子节点,与原图等价。
最后要求输出方案,考虑怎么构造最小割。
设与原点通过残量网络连通的点形成点集 \(S\),不连通的设为点集 \(T\)。
则 \(S\) 到 \(T\) 的任意正向边就为最小割。
Code
#include