二分图相关技术
Bipartite Graph.
无特殊说明时,
基础部分
定义和判定
点集可以分成两个集合,任意一个集合内部没有边。
性质:没有奇环。这是充要条件。用这个来
二分图最大匹配
可Dinic
注意这里的Dinic
介绍一下匈牙利算法。
本质是找一条增广路
给出匈牙利。
匈牙利板子
#include<bits/stdc++.h>
using namespace std;
const int maxn=510;
int n,m,k,ans,mat[maxn];
bool vis[maxn],g[maxn][maxn];
bool dfs(int u){
for(int v=1;v<=m;++v){
if(!g[u][v]||vis[v]) continue;
vis[v]=true;
if(!mat[v]||dfs(mat[v])){
mat[v]=u;
return true;
}
}
return false;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;++i){
int u,v;
scanf("%d%d",&u,&v);
g[u][v]=true;
}
for(int i=1;i<=n;++i){
memset(vis,0,sizeof(vis));
if(dfs(i)) ans++;
}
printf("%d\n",ans);
return 0;
}
二分图最大权匹配
满足是最大匹配的同时边权和最大。
可以跑费用流,但时间复杂度不是多项式,是伪多项式
König定理
对于一张二分图,最大匹配数等于最小点覆盖数(选最少的点使得每条边两端都有至少一个点被选中)。
构造就是从每个非匹配的右部点(或者左部点)出发,找增广路。把经过的每个点标记。最小点覆盖就是右边没被标记的点和左边被标记的点。
König定理推论
最大独立集为最小点覆盖的补集。
Hall定理
这是判断二分图是否有完美匹配的最高准则。
设左部点集合为
来证明一下,首先必要性是显然的,下证充分性。来反证法,假设有一张满足Hall定理但没有完美匹配的二分图。设
-
如果
未匹配,那么直接匹配就行。 -
如果
匹配了,那么设 与 匹配了。用Hall定理,与 相邻的右部点集合 满足 ,于是还有一个新点与 相邻。
可以发现第二种情况的过程类似于找增广路。由于最后
典中典
DAG的最小不相交路径覆盖
点不相交。
Sol:
将每个点
如果原图中有边
原本每个点作为一条路径,覆盖整个DAG。二分图上每个匹配使得两条路径拼起来,路径数
DAG的最小可相交路径覆盖
点可以相交了。
Sol:
先传递闭包求出连通性。如果传递闭包后得到存在路径
等着补吧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】