网络流二元关系

最最最基本模型

有n个任务,可以选择A任务或者B任务,代价分别是a,b,还有一些三元组关系,[x,y,z]表示如果x任务和y任务选的任务不同,将会有一个额外的代价c,现在分配任务,使总代价最小。
网络流二元关系_第1张图片
按以上方式建图,跑最小割即是答案。

为什么呢?
其实这个图有个好性质,就是如果你已经割了两个不在一侧的边,那你必然要割中间的一条,这样的话,就可以用了。
题设是不同的任务会产生代价,那我们把不同的放在两侧就行了。

T1&T1’:

把模型改一下,改成相同会产生代价。
网络流二元关系_第2张图片
那就交换一下顺序,这样可以保证割了相同的时,中间的也会被割掉一个。
由于是a、b的连边是相反的,在建图之前我们需要染色。
如果遇到奇环怎么办呢?

在这里提供一种不用使a、b的连边相反的方法:
网络流二元关系_第3张图片

这是我在做题中遇到的一个可以应对所有“相同有代价”一类问题新方法,并且它更强,可以是一个集合S集合内的元素相等产生代价,代价也可以是针对都选的是A任务或B任务而不同。

原理:

把相同产生代价z,改成都选A产生代价z_a,都选B产生代价z_b。
以“都选A产生代价z_a”为例。
新建了一个点A’,S到它有流量为z_a的弧,它到S集合的各个元素有流量为max的弧。
已经割了a_x和a_y后,也要割z_a,所以是对的。

b的同理,再建一个即可。

T2&&T2’:

最小费用,不同任务的有一个负的代价(代价全是负的)。

我们知道流量不能是负的,所以怎么办呢?
infleaking:不同任务有代价就相当于相同任务无代价,相同任务有代价就相当于不同任务无代价。
可以先求出所有负代价的和,把它们看作正代价,再求相同有代价的最小割加上之前的和就是答案。

原理:

如果x,y选择相同的,就相当于不要那个负的代价了。

如果代价又有正又有负怎么办呢?
代价是正的和普通的一样连,求出所有负代价的和,转换一下,然后按照T1’的方式连弧求的是相同会产生代价,答案是最小割加上所有负代价的和,显然这样不会有问题。

T3:

最小变成最大。
按最小的构图。
先求所有的代价的和,求出最小割,再用和减去最小割。

以上是一些最基础的构图,谢谢YL的PPT。

你可能感兴趣的:(网络流,二元关系)