HDU 2063 过山车 二分图最大匹配(模板题)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 2063 过山车 二分图最大匹配(模板题)相关的知识,希望对你有一定的参考价值。

http://acm.hdu.edu.cn/showproblem.php?pid=2063

https://www.renfei.org/blog/bipartite-matching.html

交替路:从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边…形成的路径叫交替路。

增广路:从一个未匹配点出发,走交替路,如果途径另一个未匹配点(出发的点不算),则这条交替路称为增广路(agumenting path)

增广路有一个重要特点:非匹配边比匹配边多一条。因此,研究增广路的意义是改进匹配。只要把增广路中的匹配边和非匹配边的身份交换即可。由于中间的匹配节点不存在其他相连的匹配边,所以这样做不会破坏匹配的性质。交换后,图中的匹配边数目比原来多了 1 条。

 

#include <bits/stdc++.h>
using namespace std;
const int N=2e3+20;
typedef long long ll;
int g[N][N];// 两边定点的连线 
int k,n,m,vis[N];
int linker[N];
int dfs(int u)
{
	for(int i=1;i<=m;i++)
	{
		if(g[u][i]&&!vis[i])
		{
			vis[i]=1;
			if(linker[i]==-1||dfs(linker[i]))//如果u-i未匹配||i匹配 走匹配边 
			{
				linker[i]=u;//非匹配边和匹配边交换 
				return true;
			}
		}
	}
	return false;//无增广路 
}
int hungary()
{
	int res=0;
	int u;
	memset(linker,-1,sizeof(linker));
	for(int i=1;i<=n;i++)
	{
		memset(vis,0,sizeof(vis));		
		if(dfs(i))//从未盖点出发找增广路 
			res++;
	}
	return res;
} 
int main()
{
	while(cin>>k&&k)
	{
		memset(g,0,sizeof(g));
		cin>>n>>m;
		int u,v;
		for(int i=1;i<=k;i++)
		{
			cin>>u>>v;
			g[u][v]=1;
		}
		printf("%d\n",hungary());//最大匹配 
	}
	return 0;
}

  

以上是关于HDU 2063 过山车 二分图最大匹配(模板题)的主要内容,如果未能解决你的问题,请参考以下文章

hdu2063 匈牙利算法 二分最大匹配模版题

hdu2063 过山车二分图匹配

hdu 2063 过山车 二分图的最大匹配 匈牙利算法

HDU2063(二分图最大匹配)

luogu3386 模板二分图匹配 匈牙利算法 hdu2063 过山车 dinic

hdu-2063-二分图最大匹配