一名苦逼的OIer,想成为ACMer

Iowa_Battleship

随笔分类 -  二分图

最大匹配、带权匹配、覆盖、独立集等
BZOJ1433或洛谷2055 [ZJOI2009]假期的宿舍
摘要:"BZOJ原题链接" "洛谷原题链接" 对于每个需要床位的人向他能睡的床连边,然后就是二分图最大匹配模板了。 这里用匈牙利算法。 cpp include include using namespace std; const int N = 55; const int M = 1e4 + 10; in 阅读全文

posted @ 2018-11-04 21:26 Iowa_Battleship 阅读(124) 评论(0) 推荐(0) 编辑

BZOJ1059或洛谷1129 [ZJOI2007]矩阵游戏
摘要:"BZOJ原题链接" "洛谷原题链接" 通过手算几组例子后,很容易发现,同一列的$1$永远在这一列,且这些$1$有且仅有一个能产生贡献,行同理。 所以我们可以只考虑交换列,使得每一行都能匹配一个$1$,且每一行匹配的$1$没有重列的,最后交换行排序下即可达到目标。 解决这个问题就不难了,对于一个格子 阅读全文

posted @ 2018-10-17 13:45 Iowa_Battleship 阅读(91) 评论(0) 推荐(0) 编辑

洛谷1894 [USACO4.2]完美的牛栏The Perfect Stall
摘要:"原题链接" 二分图最大匹配板子。 每个奶牛向它愿意去的牛棚连边,跑二分图最大匹配即可。 这里我用的是匈牙利算法。 cpp include include using namespace std; const int N = 410; const int M = N N; int fi[N], ne 阅读全文

posted @ 2018-10-17 12:40 Iowa_Battleship 阅读(92) 评论(0) 推荐(0) 编辑

洛谷2417 课程
摘要:"原题链接" 对于每一个课堂,向能够来这堂课的学生连边,然后跑二分图最大匹配,判断是否是完全匹配即可。 这里我是用的匈牙利算法。 cpp include include using namespace std; const int N = 1e5 + 10; int fi[N], di[N], ne 阅读全文

posted @ 2018-10-17 12:18 Iowa_Battleship 阅读(123) 评论(0) 推荐(0) 编辑

CH#17C 舞动的夜晚
摘要:"原题链接" 即求二分图的不可行边数量,因为不保证是完备匹配,所以需要通过网络流求出任意一组最大匹配,并建立新图判断。 建新图:对于跑完网络流的图上已经匹配的边,建立反边;对于没有匹配的边,建立正边(图只改变边的方向,别的结构不变)。 有结论: 1. 必须边的判定条件为:$(x,y)$的流量为$1$ 阅读全文

posted @ 2018-09-16 18:08 Iowa_Battleship 阅读(599) 评论(0) 推荐(0) 编辑

CODE[VS]2494 Vani和Cl2捉迷藏
摘要:"原题链接" 这里有一个结论:最多能选取的藏身点个数等于最小路径可重复点覆盖的路径总数。 所以我们可以先传递闭包,然后求最小路径点覆盖即可。 cpp include include using namespace std; const int N = 210; int mtc[N], n; bool 阅读全文

posted @ 2018-09-15 08:28 Iowa_Battleship 阅读(186) 评论(0) 推荐(0) 编辑

CH6901 骑士放置
摘要:"原题链接" 和棋盘覆盖( "题解" )差不多.。 同样对格子染色,显然日字的对角格子是不同色,直接在对应节点连边,然后就是二分图最大独立集问题。 cpp include include using namespace std; const int N = 1e4 + 10; const int M 阅读全文

posted @ 2018-09-15 07:35 Iowa_Battleship 阅读(205) 评论(0) 推荐(0) 编辑

POJ2226 Muddy Fields
摘要:"原题链接" 因为每一块泥地要么被横着的木板盖住,要么被竖着的木板盖住,所以可以转换为二分图最小点覆盖问题。 我们可以先标记出所有连续的行泥地和连续的列泥地。 比如对于原题中的样例,标记后是这样的: 行连续泥地:$\begin{pmatrix}1 & 0 & 2 & 0 \\ 0 & 3 & 3 & 阅读全文

posted @ 2018-09-14 16:32 Iowa_Battleship 阅读(85) 评论(0) 推荐(0) 编辑

POJ1325 Machine Schedule
摘要:"原题链接" 对于每个任务,要么选$A$机器的模式,要么选$B$机器的模式,由此想到二分图最小点覆盖。 所以我们可以将任务作为边,将对应的$A$机器模式和$B$机器模式连起来,然后直接求最小覆盖即可。 注意,本题模式从$0$开始编号,而且机器初始是在$0$模式,所以在连边时要忽略含$0$模式的任务。 阅读全文

posted @ 2018-09-14 12:50 Iowa_Battleship 阅读(78) 评论(0) 推荐(0) 编辑

POJ3565 Ants
摘要:"原题链接" 要求所有线段不相交,实际上满足每条线段的长度和最小。 所以我们可以让蚁窝和苹果树连边,边权为两点的距离,然后就是求二分图带权最小匹配了,可以上$KM$算法或是费用流。 这里我使用的是费用流。 阅读全文

posted @ 2018-09-14 12:21 Iowa_Battleship 阅读(82) 评论(0) 推荐(0) 编辑

JoyOI1935 导弹防御塔
摘要:"原题链接" 首先可以二分答案,然后考虑检验答案。 我们可以对炮塔进行拆点,即能发射$x$颗导弹就拆成$n\times x$个点,作为一个集合,另一个集合则是$m$个侵入者,然后对于能在剩余时间攻击到侵入者的炮弹和该侵入者连边,然后跑匈牙利或网络流求二分图最大匹配即可(本质是多重匹配,使用拆点法)。 阅读全文

posted @ 2018-09-13 19:44 Iowa_Battleship 阅读(173) 评论(0) 推荐(0) 编辑

CH6802 車的放置
摘要:"原题链接" 和棋盘覆盖( "题解" )差不多。 将行和列看成$n+m$个节点,且分属两个集合,如果某个节点没有被禁止,则行坐标对应节点向列坐标对应节点连边,然后就是求二分图最大匹配了。 cpp include include using namespace std; const int N = 4 阅读全文

posted @ 2018-09-13 14:26 Iowa_Battleship 阅读(164) 评论(0) 推荐(0) 编辑

JoyOI1035 棋盘覆盖
摘要:"原题链接" 对棋盘染色,坐标和为奇数的染黑,偶数为白。这时会发现对于相同颜色的格子,是无法放置骨牌的,这样我们就将所有格子分成两类,然后根据能否放置骨牌连边,最后就是求二分图最大匹配了。 这里我是用的匈牙利算法。 cpp include include using namespace std; c 阅读全文

posted @ 2018-09-13 13:48 Iowa_Battleship 阅读(200) 评论(0) 推荐(0) 编辑

导航