二分图匹配的那些事
最小点覆盖(每条边至少选一个点)=最大匹配
最大独立集(每条边最多选一个点)=总点数-最小点覆盖
一般匈牙利只用建单向边就行了(从左到右),而从右到左用的是
给格子图黑白染色,注意到马的攻击范围的点均为异色,所以进行二分图匹配,求最大独立集。
以题目为左半图,以锦囊为右半图。
记录一下左半图的匹配,注意一下,一道题目答不出来就结束了。
有向无环图的最小不可交路径覆盖(DAG图上一些不相交的路径,满足每个点恰好在一条路径上)=原图结点数-新图最大匹配。
新图:把每个点 V 拆成 Vx ,Vy ,如果有边 A -> B ,则加边 Ax -> By 。
证明:路径不可交,所以点只能匹配一次,每次匹配成功一次,就有一个点可以并到其他点中,答案减一,所以
最小不可交路径覆盖=原图结点数-新图最大匹配。
如上
如果
所以这题只要不断增加珠子的个数,直到最小路径覆盖大于
对可走格子进行黑白染色。
当黑白二分图形成完备匹配时,无论先手选什么,后手选他的匹配点最后一定必胜,所以输出 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;
}
有向无环图的最小可交路径覆盖。
除加边方式其他与“有向无环图的最小不可交路径覆盖”一样。
加边:用floyd求传递闭包,如果a到b有边,就加边a->b。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话