二分图

二分图匹配(匈牙利算法)

匈牙利算法就是用增广路求最大匹配问题

可以理解为是左部图被匹配

时间复杂度为\(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\) 定理:最长反链 \(=\) 最小可重链覆盖

可以先传递闭包,此时最小可重链覆盖即为最小路径点覆盖,那么最长反链即为最小路径点覆盖

posted @ 2020-01-22 20:03  lhm_liu  阅读(273)  评论(0编辑  收藏  举报