Description
题目链接:SPOJ 839
给你一个由 $n$ 个点和 $m$ 条边的无向图(保证没有重边与自环),每个点都有一个整数标记 $mark_i$。对于边 $(u,v)$,我们定义 $\text{cost}(u,v)=mark_u\oplus mark_v$(其中 $\oplus$ 表示异或),那么整张图的总花费为所有边的 $\text{cost}$ 之和。
现在有 $k$ 个点已经有标记了,你需要确定其他 $n-k$ 个点的标记,使得总花费最小。
本题 $T$ 组数据。
数据范围:$1\le T\le 10$,$0<n\le 500$,$0\le m\le 3000$,$0\le mark_i<2^{31}$
Solution
这个异或直接处理不方便,难以转化为一般的运算。由于 $\text{XOR}$ 的运算是各个二进制位相互独立的,那么我们可以分别考虑每个位。
那么就有子问题:每个点的标记为 $0$ 或 $1$,要求最小化总花费。
注意到这张图可以被分为两个点集,对于一条边的两个端点,如果他们的值相同则没有贡献,否则对答案有 $1$ 的贡献。我们只要最小化这个贡献即可。于是问题等价于:我们要把这 $n$ 个点放入 $1$ 集合或者 $0$ 集合,连通这两个集合的边的权值和就是贡献和,我们需要最小化这个贡献,显然这是一个最小割模型。
考虑如何建图。首先对题目中给出的所有边建立无向边,容量都为 $1$。对于 $k$ 个已经有标记的点,如果当前二进制位为 $1$,那么向源点 $S$ 连一条容量为 $\text{INF}$ 的边;否则向汇点 $T$ 连一条容量为 $\text{INF}$ 的边(这些反向边的容量均为 $0$)。
接下来对这张图求最小割,割边显然都是原边。求得的最小割即为当前二进制位的最优解。考虑如何计算标记值,我们只要从 $S$ 开始遍历所有满流的边,这些点在当前二进制位上的值均为 $1$。
时间复杂度:$O(n^2m\log n)$($\text{Dinic}$)
Code
1 |
|