网络流的一些经典问题

涂色问题:

问题:给出一个\(n*m\)的矩阵(\(n,m\leq30\)),每个格子都要求涂上一种颜色,且每个格子不能被涂两次以上(每次都是相同颜色则可以),涂同一行或列连续的一些格子涂色的代价分别为\(a\)\(b\),单独涂一个格子的代价为\(c\),求将整个矩阵涂至目标状态的最小代价和。

解析:我们先预处理出每行和每列相同颜色连续的“颜色条”,那么每个格子都仅属于一个行颜色条和列颜色条,设它对应的行、列颜色条序号为\(h_i,v_j\),那么我们连边 \(S\) ->\(h_i\) -> \(v_i\) -> $T $ ,代价分别为\(a,c,b\),在这个图上求出最大流,因为对于任意一个这样的链,它的上面一定存在一个割,所以最小割即是答案。


狼与羊的故事(BZOJ 1412)

问题:给出一个\(n*m\)的矩阵,每个格子可以是狼的领地,羊的领地或空地,现要求最短的篱笆(即覆盖一个格子的一条边),使得狼羊领地分离。

这里写图片描述

解析:我们可以把它按图中所示转化为最小割问题,每个格子向周围四格连容量为1的边,对于每条狼 -> 羊的路径上一定有一条割。

这里写图片描述


公平分配问题(LA 3231)

问题:现在有\(n\)个任务和\(m\)个处理器,每个任务给出两个不同的候选处理器,可在两者之间任选其一完成任务,求完成所有任务时单个处理器处理任务最大值的最小值

解析:二分答案\(p\),对于每次查询,构建二分图,\(S\)向所有任务连一条容量为1的边(表示任务),每个任务向两个处理器结点连边,容量为1,每个处理器结点向\(T\)连边,容量为\(p\)(表示处理的任务数不能超过\(p\)),如果当前最大流等于任务数说明有解,反之无解。


最小覆盖问题——行列模型(POJ 3041)

问题:有一个\(n*m\)的矩阵,\(K\)个格子上存在《经典题选》,每一次可以选择矩阵的一行或一列,烧掉这一行或这一列上所有的题选,求烧掉所有题选的最小操作数。

解析:令行为X集,列为Y集,若\((r,c)\)上存在题选则连边\(r ->c\),那么对于任意这样的一条边,两端必须有一个节点被选中,即最小顶点覆盖 (= 最大匹配 )


posted @ 2017-01-03 19:15  Krew  阅读(671)  评论(0编辑  收藏  举报