二分图匹配的那些事
\(\color{lightblue}\text{skill1}\)
最小点覆盖(每条边至少选一个点)=最大匹配
最大独立集(每条边最多选一个点)=总点数-最小点覆盖
一般匈牙利只用建单向边就行了(从左到右),而从右到左用的是 \(match\) 数组。
\(\color{purple}\text{P4304 [TJOI2013]攻击装置}\)
\(\color{green}\text{2023.1.30 12:50}\)
给格子图黑白染色,注意到马的攻击范围的点均为异色,所以进行二分图匹配,求最大独立集。
\(\color{darkblue}\text{P2319 [HNOI2006]超级英雄}\)
\(\color{green}\text{2023.1.30 13:22}\)
以题目为左半图,以锦囊为右半图。
记录一下左半图的匹配,注意一下,一道题目答不出来就结束了。
\(\color{lightblue}\text{skill2}\)
有向无环图的最小不可交路径覆盖(DAG图上一些不相交的路径,满足每个点恰好在一条路径上)=原图结点数-新图最大匹配。
新图:把每个点 V 拆成 Vx ,Vy ,如果有边 A -> B ,则加边 Ax -> By 。
证明:路径不可交,所以点只能匹配一次,每次匹配成功一次,就有一个点可以并到其他点中,答案减一,所以
最小不可交路径覆盖=原图结点数-新图最大匹配。
\(\color{purple}\text{P2764 最小路径覆盖问题}\)
\(\color{green}\text{2023.2.1 9:47}\)
\(skill2\) 的模板题。
\(\color{purple}\text{
UVA1201 Taxi Cab Scheme}\)
\(\color{green}\text{2023.1.30 20:01}\)
如上 \(skill2\) ,如果一个乘客接完后可以接下一个乘客,就连一条单向边。时间不可逆,无环。一个乘客只能接一次,所以是出租车之间的路径不交。有向无环图的最小不可交路径覆盖。
\(\color{purple}\text{P2765 魔术球问题}\)
\(\color{green}\text{2023.2.1 13:01}\)
如果 \(i\) 数字与 \(j\) 数字相加为完全平方数,(且 \(i\) 小于 \(j\))那么说明 \(i\) 上可以放 \(j\) 建边 \(i->j\) ,我们发现一堆数字所需的最少柱子数即为此图的最小不可交路径覆盖。
所以这题只要不断增加珠子的个数,直到最小路径覆盖大于 \(n\) ,输出珠子数 \(-1\) 。
\(\color{purple}\text{P4055 [JSOI2009] 游戏}\)
\(\color{green}\text{2023.1.30 21:22}\)
对可走格子进行黑白染色。
当黑白二分图形成完备匹配时,无论先手选什么,后手选他的匹配点最后一定必胜,所以输出 LOSE。
当非完备匹配时,选一种最大匹配的非匹配点即可先手必胜。(先手将后手引入最大匹配局面)。
问题在怎么求出所有非必须匹配点 ,当任意进行一次最大匹配后,得到的 非匹配点 ,可以遍历它的边选中这条边的话,这条边的另一个端点就会变成非匹配点,如此便可求出所有非必须匹配点。
void get_ans(int u){
ans[u]=1;//标记为非匹配点
for(int i=head[u];i;i=last[i]){
int v=to[i];
if(!match[v] || ans[match[v]])continue;
get_ans(match[v]);
}
return;
}
\(\color{lightblue}\text{skill3}\)
有向无环图的最小可交路径覆盖。
除加边方式其他与“有向无环图的最小不可交路径覆盖”一样。
加边:用floyd求传递闭包,如果a到b有边,就加边a->b。

浙公网安备 33010602011771号