网络流拓展六
uva 1660
题目要求
紫书P380
最少删除多少个点 破坏原图的连通性
参考AC代码
|
|
思路
经典的最小割问题 不过不是割边而是割点
为了形成割,那么必须让点具有“流量”的性质 我们将每个点拆成两个点 连一条容量为1的边 那么每个点就被赋予了流量的性质 边的容量为无穷大 因为要删除点而不是边
另外因为我们不知道要割哪两个集合才能使得最大流最小 所以我们可以枚举源点和汇点
我们固定源点为0,只需要枚举汇点即可 取得的最小的最大流就是使得图不连通的最小割
注意:
1.不要忘了令源点和汇点的容量为无穷大 因为我们是不删除这两个点的 对应着0到n的容量为inf 以及每次对应的t到t+n为inf
2.需要设置一个ori保存最原始的edges 对应每个t 要在ori的基础上修改inf
3.若ans==inf表示0与所有点都无法形成最小割 那么只能删除所有的点
uva 12433
题目要求
紫书P384
参考AC代码
|
|
思路
很神奇的建图:
假设有5天的租车需求,虚拟出2×n+2即12个节点 0为源点 12为汇点
源点到12345流量为r[i],费用为0
678910到汇点流量为r[i-n],费用为0
虚拟第2×n+1个节点为买车途径 源点到2×n+1节点花费为p[i],流量为c[i] 存在重边 对于每一个i+n节点 其来源有两个 一个是2×n+1节点 即购买新车 一个是之前的车辆送去维修后的可用车辆。
连接i和i+1节点,流量为INF,花费为0。同时根据维修的天数
连接i和d[j]+i+1+n节点,花费为s[i],流量为INF。
若满流输出cost 否则输出impossible
HDU 5520
题目要求
NxM的格子有些上面有数字,现在要把奇数跟偶数配对连起来,其他的格子连成一个个回路,单独的相邻两个格子相连也算是一个回路按两条边算,连线不能相交,相邻两个格子相连的费用全都给出来了,求最少的费用。
参考AC代码
|
|
思路
最小费用流水题
0点和奇数点向S连一条边 flow=1 cost=0 确保只能走一次
0点和偶数点向T连一条边 flow=1 cost=0
对于每个向左和向下的相邻格子连一条边 flow=1 cost=x
跑一边mcmf 如果满流输出cost 否则输出-1
cf 884f
题目要求
给定一个字符串s 长度为偶数 每个位置有一个权值bi
现定义一个字符串是anti回文串 满足ai不等于a(m-i+1)
求用给定的字符串s能构成的anti回文串 使得ti==si位置的点权和最大是多少
参考AC代码
|
|
思路
最小费用最大流 比较难建图 类似与匹配的思想
本题相当于把每对头尾2个数字绑在一起当作一个点做匹配
统计每个字母出现的次数hashh 每个字母向S连一条容量为hashh 费用为0的边
再加上n/2个点 每个点表示头尾绑在一起的2个点 每一对点向T连一条流量为2 费用为0的边
考虑中间的建图:遍历每一个字母c 如果si和s(m-i+1)两个点都是c 那么该字母向该对数字连一条流量为1 费用为-max(ai,a(m-i+1))的边
如果两个点均不是c 费用0 如果有一个点i是c 那么费用为-a[i] 跑一边mcmf -ans就是所求
这是因为 每一个字母相当于在一个pair中找匹配 如果2个都匹配 取一个最大的 如果2个都不匹配 不匹配 如果只有一个匹配 费用为那个匹配的权值
三块流量分别为hashh 1 2 满足每个字母只能匹配可以匹配的一个位置
2016icpc北京区域赛C
题目要求
有一个N×N的01矩阵 0代表白色 1代表黑色
给出N×N/2个点对 点对之间的2个点可以互相交换
每行和每列有一个黑色点的上下界限制
问最少经过多少次交换后可以满足行和列的限制 若不能输出-1
参考AC代码
|
|
思路
有源有汇有上下界最小费用最大流
参考博客
实际上就是求s到t 最少黑点的移动个数可以满足流量的限制
有源有汇转成无源无汇 由t再连向s 下界为黑色点的个数 上界为inf 构成循环流 构成无源无汇
用模版建图
2017icpc青岛区域赛K
转跳链接
拆分成三段的mcmf
gym(2017-united-kingdom-ireland-programming-contest-ukiepc)K
题目要求
要求输出路径的匹配
参考AC代码
|
|
思路
建图很简单 注意两个大于等于即可
关键在于输出路径 反向边flow小于0表示有流量经过
类似与背包dp的输出路径 递归逆序输出即可
la 7264
题目要求
n个点 m条边 目标点S 每条边有一个权值
边权表示删除这条边的花费
如果要取到点S 必须要取到点S的前驱结点
第一行n个值表示正常取前驱每个点的点权
下一行的n个值表示不考虑前驱直接取到某个点的点权
问取到S点的最少花费
参考AC代码
|
|
思路
可以转换成最小割模型
s到i为原始点权 i到i+n为直接取到的点权 u+n到v为边权 k+n连到T
割断S到T(实际为k)的连通性的最小割就是所求