二分图
二分图匹配(匈牙利算法)
匈牙利算法就是用增广路求最大匹配问题
可以理解为是左部图被匹配
时间复杂度为\(O(nm)\),但事实上,对于绝大部分的二分图,匈牙利算法都跑不够上限
此时\(mtc[i]\)储存的为右部图\(i\)所对应左部图的匹配
\(code\):
bool dfs(int x)
{
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to;
if(vis[y]) continue;
vis[y]=true;
if(!mtc[y]||dfs(mtc[y]))
{
mtc[y]=x;
return true;
}
}
return false;
}
......
for(int i=1;i<=n;++i)
{
memset(vis,0,sizeof(vis));
if(dfs(i)) ans++;
}
二分图最小点覆盖
给定一张二分图,求出一个最小的点集\(S\),使得图中任意一条边都已至少一个端点属于\(S\)。这个问题被称为二分图的最小点覆盖,简称最小覆盖
最小点覆盖\(=\)最大匹配
二分图最小覆盖模型的要素:每条边有两个端点,二者至少选择一个
求最小点覆盖方案:SAM I AM
二分图最大独立集
在一张无向图中,满足任意两点之间都没有边相连的点集被称为图的独立集。包含点数最多的一个被称为图的最大独立集
在一张无向图中,满足任意两点之间都有边相连的子图被称为图的团。包含点数最多的一个被称为图的最大团(团其实就是完全图)
最大独立集\(=n-\)最大匹配
无向图的最大团\(=\)其补图的最大独立集
有向无环图的最小路径点覆盖
给定一张有向无环图,要求用尽量少的不相交的简单路径,覆盖有向无环图的所有顶点(也就是每个顶点恰好被覆盖一次)。这个问题被称为有向无环图的最小路径点覆盖,简称最小路径覆盖
把每个点拆成编号为\(x\)和\(x+n\)的两个点。建立一张新的二分图,\(1 \sim n\)是左部点,\(n+1 \sim 2n\)是右部点。对原图的每条有向边\(( x,y)\),在二分图的左部点\(x\)与 右部点\(y+n\)之间连边。最终得到的二分图成为原图的拆点二分图
有向无环图的最小路径点覆盖包含的路径条数\(=n-\)其拆点二分图的最大匹配数
最长反链:在有向无环图中,选出一个最大的点集,点集内任意两点不能互达
\(Dilworth\) 定理:最长反链 \(=\) 最小可重链覆盖
可以先传递闭包,此时最小可重链覆盖即为最小路径点覆盖,那么最长反链即为最小路径点覆盖