这道题肯定用网络流,不然 n o d g d nodgd nodgd给你放在网络流考试里干嘛
题意:
给了一个有向无环图,给(除了根节点)每个节点选一条出边构成一棵树,让儿子个数最多的节点的儿子个数最少。(根节点不算)
依次输出每个节点的父亲,要求字典序最小。
先不考虑字典序,考虑计算最小的负载级别。
很显然想到负载级别可以用二分答案来求。
判断负载级别为K是否可行,于是我们可以建出这样一幅图来:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dYagcp8d-1608452773027)(https://cdn.luogu.com.cn/upload/image_hosting/659jrj0b.png)]
然后计算最大流,如果最大流= N N N,说明负载级别可以等于 K K K
那么如何验证字典序最小呢?
枚举
在过程中,我们已经确定了 f a [ 0 ] fa[0] fa[0]$fa[i-1]$,此时枚举$fa[i]$,$fa[i+1]$ f a [ n − 1 ] fa[n-1] fa[n−1]未确定。
那么 0 0 0$i-1$节点只和已确定的父亲连边,$i$号节点也和枚举的父亲连边,$i+1$ n − 1 n-1 n−1按原来的方式连边(可能有多条)。
如果当前 f a [ i ] fa[i] fa[i]建图跑最大流=n,说明当前 f a [ i ] fa[i] fa[i]可行, f a [ i ] fa[i] fa[i]就定下来枚举 i + 1 i+1 i+1
如果最大流 < N <N <N,说明不行,继续枚举 i i i的出边作为 f a [ i ] fa[i] fa[i],继续验证即可
要跑 N