无名网络流1

题目大意:给出一个无向图,边权等于这条边连接的两个点的点权的抑或值,一直一部分点权,填出剩下的点权使得所有边权之和最小,求出这个最小值。
(n<=500,m<=3000,权值<65536)


思路:
    1)首先无论是暴力还是标算都需要先考虑到一点就是拆位,将每一位分开考虑,这样才能比较方便的判断这个点取0还是1划算(暴力是拆位+穷举).
    2)那么拆位之后我们就发现了,问题转化成了一些黑白点,一些未染色的点,我们将未染色的点染色,最小化有边相连且颜色不一样的点对个数。
    (其实想到这里网络流已经基本可以确定了,但是考试的时候没有想出怎么建图QAQ)。
那么建图就是:
    先枚举位数,对于当前位i,如果A[x][i]=1(将点权拆成2进制),连一条边<s,x,inf>.
    若A[x][i]=0,连一条边<x,t,inf>.
    若A[x][i]尚未染色,不连边。
    然后将原图复制过来,求max_flow<s,t>就是当前位数的最小相邻异色点对数了。
为什么是对的呢?
    首先这个图是一个最小割用最大流实现的例子。
    对于一个点,如果它是白色,我们通过连<s,x>这条边来强制使它成为白色,黑色亦然,流量赋为inf是为了确保它们不被割掉。
    对于没有染色的点,如果它割掉与白色点相连的边,说明它是黑色的,并因此产生了1的代价,反之亦然。
    至于原图中本来就有的点对,为了满足最大流性质,一定会被割掉。
我当时有个疑问,会不会一个中立点既被割掉了与白点连上的边,又被割掉了与黑点连上的边?如果这样就不合法了呀。
    后来发现不会,因为我们仔细想想,如果一个中立点连了一些白点,一些黑点,那么如果这两种边还有一种没有割完,就不满足最大流性质了,因为这样肯定还有能走的边没有被走到。但是如果一种边割完了,那么割另外一种边肯定是没有意义的,只会白白增加花费,所以不可能。
至此可以保证算法的正确性了。
还是太naive了.......

你可能感兴趣的:(无名网络流1)