摘要:"BZOJ原题链接" "洛谷原题链接" 对于每个需要床位的人向他能睡的床连边,然后就是二分图最大匹配模板了。 这里用匈牙利算法。 cpp include include using namespace std; const int N = 55; const int M = 1e4 + 10; in
阅读全文
摘要:"BZOJ原题链接" "洛谷原题链接" 通过手算几组例子后,很容易发现,同一列的$1$永远在这一列,且这些$1$有且仅有一个能产生贡献,行同理。 所以我们可以只考虑交换列,使得每一行都能匹配一个$1$,且每一行匹配的$1$没有重列的,最后交换行排序下即可达到目标。 解决这个问题就不难了,对于一个格子
阅读全文
摘要:"原题链接" 二分图最大匹配板子。 每个奶牛向它愿意去的牛棚连边,跑二分图最大匹配即可。 这里我用的是匈牙利算法。 cpp include include using namespace std; const int N = 410; const int M = N N; int fi[N], ne
阅读全文
摘要:"原题链接" 对于每一个课堂,向能够来这堂课的学生连边,然后跑二分图最大匹配,判断是否是完全匹配即可。 这里我是用的匈牙利算法。 cpp include include using namespace std; const int N = 1e5 + 10; int fi[N], di[N], ne
阅读全文
摘要:"原题链接" 即求二分图的不可行边数量,因为不保证是完备匹配,所以需要通过网络流求出任意一组最大匹配,并建立新图判断。 建新图:对于跑完网络流的图上已经匹配的边,建立反边;对于没有匹配的边,建立正边(图只改变边的方向,别的结构不变)。 有结论: 1. 必须边的判定条件为:$(x,y)$的流量为$1$
阅读全文
摘要:"原题链接" 这里有一个结论:最多能选取的藏身点个数等于最小路径可重复点覆盖的路径总数。 所以我们可以先传递闭包,然后求最小路径点覆盖即可。 cpp include include using namespace std; const int N = 210; int mtc[N], n; bool
阅读全文
摘要:"原题链接" 和棋盘覆盖( "题解" )差不多.。 同样对格子染色,显然日字的对角格子是不同色,直接在对应节点连边,然后就是二分图最大独立集问题。 cpp include include using namespace std; const int N = 1e4 + 10; const int M
阅读全文
摘要:"原题链接" 因为每一块泥地要么被横着的木板盖住,要么被竖着的木板盖住,所以可以转换为二分图最小点覆盖问题。 我们可以先标记出所有连续的行泥地和连续的列泥地。 比如对于原题中的样例,标记后是这样的: 行连续泥地:$\begin{pmatrix}1 & 0 & 2 & 0 \\ 0 & 3 & 3 &
阅读全文
摘要:"原题链接" 对于每个任务,要么选$A$机器的模式,要么选$B$机器的模式,由此想到二分图最小点覆盖。 所以我们可以将任务作为边,将对应的$A$机器模式和$B$机器模式连起来,然后直接求最小覆盖即可。 注意,本题模式从$0$开始编号,而且机器初始是在$0$模式,所以在连边时要忽略含$0$模式的任务。
阅读全文
摘要:"原题链接" 要求所有线段不相交,实际上满足每条线段的长度和最小。 所以我们可以让蚁窝和苹果树连边,边权为两点的距离,然后就是求二分图带权最小匹配了,可以上$KM$算法或是费用流。 这里我使用的是费用流。
阅读全文
摘要:"原题链接" 首先可以二分答案,然后考虑检验答案。 我们可以对炮塔进行拆点,即能发射$x$颗导弹就拆成$n\times x$个点,作为一个集合,另一个集合则是$m$个侵入者,然后对于能在剩余时间攻击到侵入者的炮弹和该侵入者连边,然后跑匈牙利或网络流求二分图最大匹配即可(本质是多重匹配,使用拆点法)。
阅读全文
摘要:"原题链接" 和棋盘覆盖( "题解" )差不多。 将行和列看成$n+m$个节点,且分属两个集合,如果某个节点没有被禁止,则行坐标对应节点向列坐标对应节点连边,然后就是求二分图最大匹配了。 cpp include include using namespace std; const int N = 4
阅读全文
摘要:"原题链接" 对棋盘染色,坐标和为奇数的染黑,偶数为白。这时会发现对于相同颜色的格子,是无法放置骨牌的,这样我们就将所有格子分成两类,然后根据能否放置骨牌连边,最后就是求二分图最大匹配了。 这里我是用的匈牙利算法。 cpp include include using namespace std; c
阅读全文