网络流,二分图建模
难的永远是建模,而不是算法本身;
建模思路:
这题要看做是一个二分图来想,挑两个人出来比赛,相当于左部图匹配右部图,所以可以建一个源点 S,S 向每个左部图连一条流量为该左部图点的血量的有向边,右部图向 T 连一条流量为该右部图点的血量的有向边;
然后最关键的是题目说:每两个点只匹配一次,所以左部图向每个右部图连一条流量为 1 的有向边;最后跑一边最大费用流;
这题的建模思路有点像二分图最大匹配,但是还是有点区别;
建模思路:
这题首先要明白要求的是什么,要求的是整个图中最少的点去覆盖整个图的边,就是图的最小点覆盖;
然后观察可以发现,这个图是一个二分图,所以其最小点覆盖就是二分图的最大匹配;
答案就是 n − 二 分 图 最 小 点 覆 盖 n-二分图最小点覆盖 n−二分图最小点覆盖 也就是二分图的最大独立集
这题最好还是匈牙利算法,因为题目的二分图不一定是连通的,如果每个连通块都去找源点和终点,非常麻烦,匈牙利算法可以直接左部图匹配右部图;
建模思路:
这题推导可以发现,如果没有格子是禁止放置的,那么最多可以放 min(n,m) 个。
可以这样建模,一行一列最多放一个车,那么如果(i,j)这个位置可以放置,第 i 行和第 j 列就可以想象为它们之间进行匹配了,并且一列最多匹配一行,所以建完图就是一道二分图最大匹配的裸题了;
建模思路:
做这题首先要明白,两个点,如果它们坐标(i,j), i+j 奇偶性如果相同,那么这两个点是不会产生冲突的,所以这就可以看做是一个二分图,左部图是坐标和为奇数的点,右部图为坐标和为偶数的点;左部图连接右部图就是一个点连接其的上下左右的点(也就是奇偶性不同)。
虽然是一个二分图,但是毕竟不是二分图最大匹配(是二分图最大全权匹配),题目要求的是最大权值和,这个时候可以想到建立一个源点和汇点(一般思路);想到这,自然可以想到是往最大流上面想了,源点连接左部图,边权设为点权;右部图连接汇点,边权设为点权;然后跑一边最大流,求出值;
这个值代表的是产生冲突的最少花费,可以叫最小割吧;
建模思路:
最关键的就是要找出每个点的关系,很难发现这个图最后是和 《方格取数》 那道题一样的图,奇偶点分成一个二分图;
最后求一个二分图最大匹配就行,但是匈牙利算法会卡,毕竟复杂度比 Dinic 高了一点;